假设我在内存中有一个类型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序列化框架。
谢谢。
答案 0 :(得分:9)
http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html
对象的默认序列化机制会写入类 对象,类签名和所有非瞬态的值 和非静态字段。对其他对象的引用(除了 瞬态或静态字段)也会导致写入这些对象。 使用引用对单个对象的多个引用进行编码 共享机制,使对象的图形可以恢复到 与写原稿时的形状相同。
至于我对规范的理解,如果要共享的对象实例经过相同的ObjectOutputStream,则会获得共享对象引用。
因此,当序列化包含arr
数组的类时,每个写入的对象都会获得一个ID,对于每个通过该流的引用,只会写入该ID。在这种情况下,反序列化的图形与原始图形保持同质。
我很抱歉,但我无法帮助krio库自己的序列化机制,我很乐意向使用它的人学习。
关于kryo的编辑:
我发现了一些文档: