基于Kryo序列化机制的RPC协议——Kryonet的应用与研究

研究Kryonet协议是否支持不同版本JVM之间传递复杂对象以及引用参数,另外学习Kryonet协议。
1.java对象People、Person、Boyfriend、Boyfriend1、Address

2. 服务器端的核心代码
KryonetServer.java
public class KryonetServer {

/**
* @param args
*/
public static void main(String[] args) throws IOException{
Server server = new Server();
server.start();
server.bind(54555, 54777);

server.getKryo().register(People.class);
server.getKryo().register(Boyfriend.class);
server.getKryo().register(Boyfriend1.class);
server.getKryo().register(Person.class);
server.getKryo().register(Address.class);
server.getKryo().register(String.class);
server.getKryo().register(char[].class);
server.getKryo().register(HashMap.class);
server.getKryo().register(HashSet.class);
server.getKryo().register(ArrayList.class);

server.addListener(new Listener () {
public void received(Connection connection, Object object) {
if (object instanceof People) {
People people = (People)object;
Person boyfriend = new Boyfriend();

Person boyfriend1 = new Boyfriend1();

Address address = new Address();

List<Person> boyfriends = new ArrayList<Person>();

Map<String, Person> boyfriendMap = new HashMap<String, Person>();

Set<Person> boyfriendSet = new HashSet<Person>();
address.setZipCode("518000");
address.setUrl("中国广东深圳");
boyfriend.setAddress(address);
boyfriend1.setAddress(address);

boyfriends.add(boyfriend);
boyfriends.add(boyfriend1);

boyfriendMap.put("fengluan", boyfriend);
boyfriendMap.put("fengluan1", boyfriend1);

boyfriendSet.add(boyfriend);
boyfriendSet.add(boyfriend1);

people.setName("fenglin");
people.setBoyfriend(boyfriend);
people.setBoyfriend1(boyfriend1);
people.setBoyfriends(boyfriends);
people.setBoyfriendMap(boyfriendMap);
people.setBoyfriendSet(boyfriendSet);

connection.sendTCP(people);
}
}
});
}
}

3. 客户端核心代码
KryonetClient.java
public class KryonetClient {

/**
* @param args
*/
public static void main(String[] args) throws IOException{
Client client = new Client();
client.start();
client.connect(5000, "127.0.0.1", 54555, 54777);

client.getKryo().register(People.class);
client.getKryo().register(Boyfriend.class);
client.getKryo().register(Boyfriend1.class);
client.getKryo().register(Person.class);
client.getKryo().register(Address.class);
client.getKryo().register(String.class);
client.getKryo().register(char[].class);
client.getKryo().register(HashMap.class);
client.getKryo().register(HashSet.class);
client.getKryo().register(ArrayList.class);

People service = new People();
client.sendTCP(service);

client.addListener(new Listener(){
public void received(Connection connection, Object object) {
if (object instanceof People) {
People people = (People)object;
System.out.println(people.getName());
//System.out.println(people.getBoyfriend().getAddress() == people.getBoyfriend1().getAddress());
System.out.println(people.getBoyfriend() == people.getBoyfriends().get(0));
System.out.println(people.getBoyfriendMap().get("fengluan") == people.getBoyfriendSet().iterator().next());
System.out.println(people.getBoyfriend() == people.getBoyfriendMap().get("fengluan"));
}
}
});
}

}

4. 测试Kryo序列化是否支持引用参数传递
KryoTest.java
public class KryoTest {

/**
* @param args
*/
public static void main(String[] args) throws FileNotFoundException{


Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("file.bin"));

People people = new People();
Person boyfriend = new Boyfriend();

Person boyfriend1 = new Boyfriend1();

Address address = new Address();

List<Person> boyfriends = new ArrayList<Person>();

Map<String, Person> boyfriendMap = new HashMap<String, Person>();

Set<Person> boyfriendSet = new HashSet<Person>();
address.setZipCode("518000");
address.setUrl("中国广东深圳");
boyfriend.setAddress(address);
boyfriend1.setAddress(address);

boyfriends.add(boyfriend);
boyfriends.add(boyfriend1);

boyfriendMap.put("fengluan", boyfriend);
boyfriendMap.put("fengluan1", boyfriend1);

boyfriendSet.add(boyfriend);
boyfriendSet.add(boyfriend1);

people.setName("fenglin");
people.setBoyfriend(boyfriend);
people.setBoyfriend1(boyfriend1);
people.setBoyfriends(boyfriends);
people.setBoyfriendMap(boyfriendMap);
people.setBoyfriendSet(boyfriendSet);

kryo.writeObject(output, people);
output.close();


Input input = new Input(new FileInputStream("file.bin"));
People people1 = kryo.readObject(input, People.class);
input.close();

System.out.println(people1.getName());
System.out.println(people1.getBoyfriend() == people1.getBoyfriends().get(0));
System.out.println(people1.getBoyfriendMap().get("fengluan") == people1.getBoyfriendSet().iterator().next());
System.out.println(people1.getBoyfriend() == people1.getBoyfriendMap().get("fengluan"));
}

}

5.测试结果:kryonet-rpc虽然支持复杂传递对象,但是默认情况下不支持引用参数传递,需要调用getKryo().setReferences(true)让其支持引用参数传递,默认情况下是为false的。其底层的kryo序列化机制则默认支持传递引用参数。另外传输对象时也不是一定需要注册,调用getKryo().setRegistrationRequired(false)即可免除注册对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值