Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java序列化、Kryo和对象图_Java_Serialization_Kryo - Fatal编程技术网

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)时,引用将被共享。