Java序列化,Kryo和对象图

时间:2012-09-16 12:26:27

标签: java serialization kryo

假设我在内存中有一个类型arr的数组A,每个对象都有一个指向同一个对象B的引用字段。

插图:

A_1  A_2  A_3 ... A_N
 |    |    |       |
 |    |    V       |
 \--->\--> B <-----/

请注意,A类型的每个对象中的引用字段都指向类型为B相同对象。

现在,我将包含arr类型对象的数组A序列化为ObjectOutputStream。然后我反序列化以这种方式获得的字节。

我得到一个新数组arr1

1)数组arr1是否具有A类型的对象,以便它们都指向类型为B相同对象? (我不是指序列化之前的同一个对象,而是一个B类型的唯一新创建的对象

2)换句话说,在Java中调用serialize / deserialize会保留与序列化之前相同的对象图吗? (即新反序列化的对象图与旧的对象图同构)

3)这在哪里记录? (即请提供引文)

4)相同的问题1-3,但适用于Java的Kryo序列化框架。

谢谢。

1 个答案:

答案 0 :(得分:9)

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

  

对象的默认序列化机制会写入类   对象,类签名和所有非瞬态的值   和非静态字段。对其他对象的引用(除了   瞬态或静态字段)也会导致写入这些对象。   使用引用对单个对象的多个引用进行编码   共享机制,使对象的图形可以恢复到   与写原稿时的形状相同。

至于我对规范的理解,如果要共享的对象实例经过相同的ObjectOutputStream,则会获得共享对象引用。

因此,当序列化包含arr数组的类时,每个写入的对象都会获得一个ID,对于每个通过该流的引用,只会写入该ID。在这种情况下,反序列化的图形与原始图形保持同质。

我很抱歉,但我无法帮助krio库自己的序列化机制,我很乐意向使用它的人学习。

关于kryo的编辑:

我发现了一些文档:

  • 默认情况下,第一个之后图形中对象的每个外观都存储为整数序数。这允许序列化对同一对象和循环图的多个引用。这有少量开销,如果不需要,可以禁用以节省空间:kryo.setReferences(false);

  • This(github)是参考解析器的合约;给出了两个实现:基于ArrayList的小对象图,基于Map的大对象

  • This是默认对象数组(de)序列化程序的实现

  • 需要为(反)序列化注册类;每个注册的类都可以与一个序列化器(其中,默认的Java序列化mechanism

  • 结合使用