Java序列化、Kryo和对象图
假设我在内存中有一个类型为Java序列化、Kryo和对象图,java,serialization,kryo,Java,Serialization,Kryo,假设我在内存中有一个类型为A的对象数组arr,每个对象都有一个指向同一对象B的参考字段 说明: A_1 A_2 A_3 ... A_N | | | | | | V | \--->\--> B <-----/ A_1 A_2 A_3。。。A\N | | | | ||V| \--->\-->B 对象的默认序列化机制写入 对象、类签名和所有非瞬态 和非静态字段。对其他对象的引用(中除外) 瞬态或静态字
A
的对象数组arr
,每个对象都有一个指向同一对象B
的参考字段
说明:
A_1 A_2 A_3 ... A_N
| | | |
| | V |
\--->\--> B <-----/
A_1 A_2 A_3。。。A\N
| | | |
||V|
\--->\-->B
对象的默认序列化机制写入
对象、类签名和所有非瞬态
和非静态字段。对其他对象的引用(中除外)
瞬态或静态字段)也会导致写入这些对象。
对单个对象的多个引用使用一个引用进行编码
共享机制,以便将对象的图形还原到
与原稿书写时的形状相同。
就我对规范的理解而言,如果要共享的对象实例通过同一个ObjectOutputStream,那么您将获得共享对象引用
因此,当序列化包含arr
数组的类时,写入的每个对象都会获得一个ID,对于通过流的每个引用,只写入该ID。在这种情况下,反序列化的图与原始图保持一致
我很抱歉,但我不能帮助克里奥图书馆自己的序列化机制,我将非常高兴地向使用它的人学习
关于kryo的编辑:
我发现了一些文档:
- 默认情况下,图形中对象在第一次出现后的每个外观都存储为整数序号。这允许序列化对同一对象和循环图的多个引用。这有少量开销,如果不需要,可以禁用它以节省空间:
kryo.setReferences(false)代码>
- (github)是参考解析器的合同;给出了两种实现:小对象图基于ArrayList,大对象图基于Map
- 是默认对象数组(反)序列化程序的实现
- 类需要注册以进行(反)序列化;每个注册的类都可以与一个序列化程序耦合(其中,默认的Java序列化)
通过相同的ObjectOutputStream
,或者另外通过相同的writeObject
方法调用?仅通过相同的流;设想两个对象相互引用。将第一个(以及对第二个的引用)写入流。然后,当您将第二个文件写入同一个流(这两个文件都有ID)时,引用将被共享。