kryo 是一个针对Java的快速,高效的二进制对象图形序列化框架。
kryo的目标是高速、占用空间小、并且有简单好用的api 随时为Java对象提供持久化的能力,包括持久化为文件、数据库、或者网络传输。 kryo也可以实现深度和浅度的复制,克隆。
这是一个对象到对象的复制,而不是对象到字节数据,再到对象的过程。
可现在最新发行版
在pom文件中加入依赖项
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>5.0.0-RC4</version>
</dependency>
如果没有maven,可以使用jar
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;
}
}
kryo类自动序列化。输出和输入的类可以处理 字节字节,或者可以输出到流中。
接下来介绍下这一切都是如何工作的以及类库的高级使用方法
从kryo中拿数据或者通过kryo输出数据这个动作是通过Input 和 Output类完成的。这些类都不是线程安全的。 #####Output Output类是一个OutputStream
,能够将数据写入一个字节数组 buffer 中。如果你急需一个字节数据,这个字节数据可以获取得到,并可以直接使用。
如果输出结果是一个OutputStream输出流。那么当字节数组buffer满了后,会flush到stream中,否则output会自动扩容这个字节数组。Output类有很多高效的将原生类和字符串写为字节数组的方法。它提供了类似DataOutputStream, BufferedOutputStream, FilterOutputStream, and ByteArrayOutputStream这些类的功能,不过都在一个类里面。
Output 在写入OutputStream的时候会在字节数组中有缓冲,,所以在写完操作后,一定要调用 flush
or close
方法。
如果Output 没有以OutputStream的形式提供结果,就没必要调用 flush
or close
方法。
不同于许多流,一个Output 实例,通过设置position或者设置一个新的字节数据或者新的流,那么就可以被重复使用。
注意,无参的Output 构造器,创建的是一个未初始化的Output ,所以,在使用前一定要调用setBuffer
方法。