`

Kryo序列化框架开发测试

阅读更多
Kryo序列化框架开发测试
首先加入Kryo依赖包:
asm-4.0.jar
kryo-2.21-all.jar
minlog-1.2.jar
minlog-none-1.2.jar
objenesis-1.2.jar
reflectasm-1.07.jar


加入依赖包之后就可以开发测试了:

Kryo序列化:
public class MySerializableTest {

	public static void main(String[] args) throws IOException {
		long start =  System.currentTimeMillis();
		setSerializableObject();
		System.out.println("Kryo Serializable writeObject time:" + (System.currentTimeMillis() - start) + " ms" );
		start =  System.currentTimeMillis();
		getSerializableObject();
		System.out.println("Kryo Serializable readObject time:" + (System.currentTimeMillis() - start) + " ms");

	}

	public static void setSerializableObject() throws FileNotFoundException{

		Kryo kryo = new Kryo();

		kryo.setReferences(false);

		kryo.setRegistrationRequired(false);

		kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());

	    kryo.register(Simple.class);

		Output output = new Output(new FileOutputStream("file.bin"));
		for (int i = 0; i < 1000000; i++) {
			Map<String,Integer> map = new HashMap<String, Integer>(2);
			map.put("zhang0", i);
			map.put("zhang1", i);
			kryo.writeObject(output, new Simple("zhang"+i,(i+1),map));
		}
		output.flush();
		output.close();
	}


	public static void getSerializableObject(){
		Kryo kryo = new Kryo();

		kryo.setReferences(false);

		kryo.setRegistrationRequired(false);

		kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());

		Input input;
		try {
			input = new Input(new FileInputStream("file.bin"));
			Simple simple =null;
			while((simple=kryo.readObject(input, Simple.class)) != null){
				System.out.println(simple.getAge() + "  " + simple.getName() + "  " + simple.getMap().toString());
			}

			input.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch(KryoException e){

		}
	}

}

public class Simple implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = -4914434736682797743L;

	private String name;

	private int age;

	private Map<String,Integer> map;

	 public Simple(){

	 }

	 public Simple(String name,int age,Map<String,Integer> map){
		 this.name = name;
		 this.age = age;
		 this.map = map;
	 }


	 public String getName() {

	   return name;

	 }

	  public void setName(String name) {

	    this.name = name;

	  }

	  public int getAge() {

	    return age;

	  }

	  public void setAge(int age) {

	    this.age = age;

	  }

	  public Map<String, Integer> getMap() {
		return map;
	}

	public void setMap(Map<String, Integer> map) {
		this.map = map;
	}


	}

现在我们来做个测试,与java自带的序列化做比较,看一下序列化与反序列化的运行时间与序列化后文件大小.

Java 序列化
public class MyJavaSer {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		long start =  System.currentTimeMillis();
		setSerializableObject();
		System.out.println("java Serializable writeObject time:" + (System.currentTimeMillis() - start) + " ms" );
		start =  System.currentTimeMillis();
		getSerializableObject();
		System.out.println("java Serializable readObject time:" + (System.currentTimeMillis() - start) + " ms");
	}

	public static void setSerializableObject() throws IOException{

		FileOutputStream fo = new FileOutputStream("data.ser");

        ObjectOutputStream so = new ObjectOutputStream(fo);

		for (int i = 0; i < 1000000; i++) {
			Map<String,Integer> map = new HashMap<String, Integer>(2);
			map.put("zhang0", i);
			map.put("zhang1", i);
			so.writeObject(new Simple("zhang"+i,(i+1),map));
		}
		so.flush();
		so.close();
	}

	public static void getSerializableObject(){
		 FileInputStream fi;
		try {
			fi = new FileInputStream("data.ser");
			ObjectInputStream si = new ObjectInputStream(fi);

			Simple simple =null;
			while((simple=(Simple)si.readObject()) != null){
				//System.out.println(simple.getAge() + "  " + simple.getName());
			}
			fi.close();
			si.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			//e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}


	}

}







看一下测试结果(此测试是Simple类没带map属性的情况下测试的):
Kryo:
运行时间:
Kryo Serializable writeObject time:1203 ms
Kryo Serializable readObject time:906 ms
文件大小:
file.bin  13.2M

Java:
运行时间
java Serializable writeObject time:21156 ms
java Serializable readObject time:15500 ms
文件大小:
data.ser       22.7M

经过反复测试:
Kryo的运行速度是java Serializable 的20倍左右
Kryo的文件大小是java Serializable的一半左右。

注意:
   经过测试,序列化对象最好不要带有Java集合类(如:Map,List等),如有会大大降低序列化效率。

 

分享到:
评论

相关推荐

    序列化测试-java

    **Kryo序列化** Kryo是由Esoteric Software开发的高性能序列化库,适用于Java和Scala。相比Java内置的序列化,Kryo提供了更快的速度和更小的序列化结果。Kryo不依赖于Java的序列化机制,而是有自己的序列化框架,...

    基于高性能的Java序列化框架fse设计源码

    本项目是针对高性能Java序列化的框架fse设计源码,共包含73个文件,涵盖66个Java源文件、2个XML配置文件、1个Git忽略文件、1个LICENSE...性能测试显示,其序列化效率约为Kryo的2.3倍,反序列化效率约为Kryo的1.4倍。

    Netty服务端与客户端依靠Java序列化传输数据

    Java序列化相对较慢,对于高并发和大数据量的场景,可能需要考虑其他的序列化库,如FST、Kryo或Google的Protobuf等。这些库提供更快的速度和更小的序列化数据大小。 7. **Netty与协议**: Netty支持多种协议,如...

    kryo方式实现tomcat Session共享所需jar包

    总结,使用Kryo实现Tomcat Session共享涉及了分布式系统的会话管理、Kryo序列化库的应用,以及Tomcat的集群配置。这个过程需要对Java Web开发、网络通信和序列化有深入理解,同时也需要熟悉Tomcat的内部工作机制。...

    kryo-2.17.zip

    Kryo 是一个快速、高效的对象图形序列化框架,广泛应用于Java和Scala编程语言中。它允许将Java或Scala对象转换为字节流,便于存储或网络传输,同时也支持反序列化回原始对象。Kryo 2.17 可能包含了性能优化、新功能...

    Tomcat +memcached 依赖jar包

    2. **kryo-2.20-all.jar**:Kryo是一个快速、高效的对象序列化框架,适用于Java。在memcached场景中,Kryo用作序列化器,将Java对象转换为字节流以便存储在memcached中,同时能快速反序列化回对象。Kryo的高效性能...

    jvm-serializers:比较JVM上的序列化库的基准

    "jvm-serializers"项目提供了一个基准测试框架,用于评估和比较在JVM上运行的各种序列化库的性能。以下是一些关键知识点: 1. **Java序列化**:Java自带的序列化机制,通过实现`java.io.Serializable`接口,可以将...

    大数据的对象持久化.zip

    在Java中,有Java序列化、protobuf、Kryo等工具。 4. **ORM框架**:如Hibernate、MyBatis等,它们在传统的Web开发中广泛使用,但在大数据环境下,可能会有针对分布式系统优化的ORM解决方案,如BORM可能就是这样的...

    Dubbo面试题(2022最新版)

    Dubbo是一款高性能、轻量级的开源RPC框架,它支持多种通信协议和序列化方式,具备服务自动注册、服务发现、软负载均衡等功能,能够有效管理和优化大型分布式系统的服务交互。 3. **Dubbo的使用场景有哪些?** - ...

    Spark性能优化指南——高级篇

    比如,通过使用Kryo序列化,能够减少数据在网络中的传输量,提升Shuffle的效率。除此之外,还可以通过优化磁盘存储结构,比如使用Tachyon等内存计算框架来提升读写速度,或者利用SSD来减少磁盘I/O时间。 在实施优化...

    scala akka

    Akka提供了多种序列化方式,如Java序列化、Kryo等。 #### 5. Akka的网络功能 - **I/O**:Akka Streams提供了非阻塞的I/O操作,非常适合于处理大量的数据流。 - **Using TCP/UDP**:Akka提供了对TCP/IP协议的支持,...

    1000道 互联网Java工程师面试题 485页

    MyBatis是一种优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs...

    spark-1.3.1-bin-hadoop2.6.tgz

    - **Data serialization**:选择合适的序列化方式,如Kryo,提高数据传输效率。 - **Shuffle operations**:合理规划shuffle操作,减少网络传输和磁盘I/O。 Spark-1.3.1-bin-hadoop2.6.tgz的安装和使用,对于学习...

    InfinispanExample:显示如何使用 Infinispan 的示例

    - **序列化**: 内置多种序列化机制,如Java标准序列化、Google Protocol Buffers、Kryo等。 - **模块化设计**: 允许用户根据需求选择功能模块,降低资源消耗。 **2. 使用Infinispan示例** 在`InfinispanExample-...

    Spark-SourceCode-Customization-spark source code

    5. **序列化机制的定制**:Spark默认使用Kryo进行序列化,但也可以自定义。如果你的业务中有特殊类型的数据,可能需要在`org.apache.spark.serializer`模块中调整序列化策略。 6. **故障恢复机制的调整**:Spark的...

Global site tag (gtag.js) - Google Analytics