Kryo

Kryo 是一种用于 Java 的二进制序列化和克隆工具:快速、高效、自动化。

Kryo 是一个用于 Java 的快速高效的二进制对象图序列化框架。

该项目的目标是高速度、低大小和易于使用的 API。

该项目在任何需要持久化对象的时候都非常有用,无论是写入文件、数据库还是通过网络传输。

深度拷贝

Kryo 还可以执行自动深拷贝和浅拷贝/克隆。

这是从对象到对象的直接拷贝,而不是从对象到字节再到对象的拷贝。

快速开始

maven 依赖

<dependency>
   <groupId>com.esotericsoftware</groupId>
   <artifactId>kryo</artifactId>
   <version>5.0.0-RC4</version>
</dependency>

使用例子

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.*;

public class HelloKryo {
   static public void main (String[] args) throws Exception {
      Kryo kryo = new Kryo();
      kryo.register(SomeClass.class);

      SomeClass object = new SomeClass();
      object.value = "Hello Kryo!";

      Output output = new Output(new FileOutputStream("file.bin"));
      kryo.writeObject(output, object);
      output.close();

      Input input = new Input(new FileInputStream("file.bin"));
      SomeClass object2 = kryo.readObject(input, SomeClass.class);
      input.close();   
   }
   static public class SomeClass {
      String value;
   }
}

Deep and shallow copies

Kryo支持使用从一个对象到另一个对象的直接分配来制作对象的深层和浅层副本。 这比序列化到字节和返回对象更有效。

Kryo kryo = new Kryo();
SomeClass object = ...
SomeClass copy1 = kryo.copy(object);
SomeClass copy2 = kryo.copyShallow(object);

使用的所有序列化程序都需要支持复制。

Kryo提供的所有序列化程序都支持复制。

与序列化一样,在复制时,如果启用了引用,Kryo会自动处理对同一对象和循环引用的多个引用。

如果仅使用Kryo进行复制,则可以安全地禁用注册。

复制对象图后,可以使用Kryo getOriginalToCopyMap来获取旧对象到新对象的映射。

地图由Kryo重置自动清除,因此仅在Kryo setAutoReset为false时有用。

个人感受

这种直接深度拷贝的方式非常有效,避免序列化和反序列化的开销。

json 系列

字符串

DSL-JSON 最快的 java 实现

Ali-FastJson

Google-Gson

Jackson

二进制

Google protocol buffer

Apache Thrift

Hession

Kryo

Fst

Messagepack

Jboss Marshaling

其他

JsonPath

JsonIter

参考资料

深度拷贝