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)即可免除注册对象。