Kryo

KRyo is the Java binary serialization and cloning: fast, efficient, automatic.

Kryo is a fast and efficient binary object graph serialization framework for Java.

The goals of the project are high speed, low size, and an easy to use API.

The project is useful any time objects need to be persisted, whether to a file, database, or over the network.

深度拷贝

Kryo can also perform automatic deep and shallow copying/cloning.

This is direct copying from object to object, not object to bytes to object.

快速开始

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时有用。

个人感受

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

参考资料

深度拷贝