`

基于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)即可免除注册对象。
分享到:
评论

相关推荐

    基于Netty通信框架和Kryo序列化协议的Spring集成Nexus RPC框架设计源码

    该项目为基于Netty通信框架和Kryo序列化协议的Spring集成Nexus RPC框架设计源码,共计90个文件,涵盖70个Java源文件、8个XML配置文件、2个YAML文件、2个PNG图片文件、1个Git忽略文件、1个许可证文件和1个Markdown...

    tomcat-session序列化(tomcat-kryo序列化)

    tomcat kryo序列化,msm-memcached-session-manager-tc7-1.8.2

    akka-kryo-serialization, 基于Kryo的Akka序列化.zip

    akka-kryo-serialization, 基于Kryo的Akka序列化 akka-kryo-serialization-- Scala 和Akka基于kryo的序列化程序这个库为 Scala 和Akka提供定制的基于kryo的序列化程序。 它可以用于更高效的akka远程处理。它还可以...

    kryo序列化jar包集合

    5. **兼容性**:尽管Kryo不是Java标准的序列化机制,但它可以与Java原生的序列化系统协同工作。开发者可以选择只在需要高性能序列化时使用Kryo。 6. **Android兼容**:Kryo被广泛应用于Android应用开发,因为其轻量...

    netty传输kryo序列化的对象基于socket传输

    本主题“netty传输kryo序列化的对象基于socket传输”探讨的是如何结合Netty和Kryo,实现高效、可靠的网络数据传输。首先,我们需要了解Kryo序列化的基本原理。Kryo通过跟踪对象引用和存储类型信息来优化序列化过程,...

    Kryo序列化及反序列化用法示例

    Kryo序列化及反序列化用法示例 Kryo是Java对象图形序列化框架,它主要特点是性能高效和易用,该项目用来序列化对象到文件、数据库或者网络。序列化是指将对象转换为字节流的过程,而反序列化是指将字节流转换回对象...

    java原生序列化和Kryo序列化性能实例对比分析

    对于java原生序列化,我们使用了ObjectOutputStream和ObjectInputStream来实现序列化和反序列化,而对于Kryo序列化,我们使用了Kryo序列化器来实现序列化和反序列化。 6. 序列化的应用:序列化有很多实际应用,例如...

    kryo序列化

    3. **序列化安全性**:Kryo序列化不应用于不信任的数据,因为它可能引发安全问题,如反序列化攻击。 4. **序列化第三方库的对象**:某些第三方库的对象可能不支持Kryo序列化,或者序列化后可能无法正确恢复。在这种...

    chill:Kryo 序列化库的 Scala 扩展

    寒意 扩展,包括序列化程序和一组类,以简化 Kryo 在 Hadoop、Storm、Akka 等系统中的配置。兼容性版本之间不保证序列化兼容性,因此,我们不建议将其用于长期存储。 序列化高度依赖于 scala 版本兼容性和底层 Kryo ...

    Hadoop序列化机制

    标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...

    java高效对象序列化反序列化工具kryo-2.21

    Java对象序列化与反序列化是开发中常见的需求,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。Kryo是一款强大的、高效且易于使用的Java序列化库,特别适合对性能有高要求的场景。在本文中,我们将...

    Memcached-session-manager所需最新jar包-tomcat7-kryo序列

    【标题】:“Memcached-session-manager所需最新jar包-tomcat7-kryo序列”指的是在Tomcat7中使用Memcached作为会话管理器时,需要的特定版本的jar包,特别是与Kryo序列化相关的组件。 【描述】:“Memcached-...

    nginx+tomcat7+session共享 kryo序列化所需要包

    nginx+tomcat7+session共享 kryo序列化所需要包 1.将上面所提到的包全部拷贝到tomcat的lib下(三台tomcat都需要) 2.修改每台tomcat的conf目录下得context.xml文件或者server.xml文件,在其中加入如下任意一段代码...

    Memchached+Tomcat6|7session共享 kryo序列化所需要包

    Memchached+Tomcat6|7session共享 kryo序列化所需要包 (已经更新至1.8.2版本) 1.将所有的包拷贝至tomcat目录下的lib下面; 2.修改conf/context.xml加下面的代码: memcachedNodes="n1:127.0.0.1:11211" ...

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    标题 "34_dubbo都支持哪些通信协议以及序列化协议?" 暗示了我们即将探讨的是关于Dubbo框架在网络通信和数据序列化方面的内容。Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它为分布式应用提供了...

    kryo-demo,kryo4.0.0-demo

    《Kryo 4.0.0 序列化与反序列化详解》 在软件开发中,数据序列化和反序列化是常见的操作,它能够将对象的状态转换为可存储或传输的形式,以便后续恢复。Kryo是一款高效的序列化库,尤其在Java和Scala等语言中广泛...

Global site tag (gtag.js) - Google Analytics