开发者

Does Java Serialization work for cyclic references?

开发者 https://www.devze.com 2022-12-12 04:40 出处:网络
For example:Object A contains Object B that contains Object C that contains Object A. Will Object A serialize properly?

For example: Object A contains Object B that contains Object C that contains Object A.

Will Object A serialize properly?

Comment #9 here indicates that it does not work .

In contrast, XStream indicates that it does handle cyclic reference开发者_运维问答s.


Yes, the default Java serialization works for cyclic references. When you serialize object C, the field will contain a backreference to the already-serialized object A instead of serializing it again.


Yes, Java serialization works for circular references, read here for more information to help your understanding of what Java serialization can do.


Yes it does.

I did this very, very, simple test, and at least it finish the serialization. I assume it is correct, but you can check that with some extra lines.

import java.io.*;
class A implements Serializable { B b; }
class B implements Serializable { C c; }
class C implements Serializable { A a; }
class Test {
    public static void main( String [] args ) throws IOException {
        A a = new A();
        a.b = new B();
        a.b.c = new C();
        a.b.c.a = a;
        new ObjectOutputStream( new ByteArrayOutputStream( ) ).writeObject( a );
        System.out.println("It works");

    }    
}


Yes - with one big caveat: You can't use writeReplace/readResolve where the object graph contains a cycle. The reason is explained here.

This means that cyclic object graphs are incompatible with use of Josh Bloch's SerializationProxy pattern in the general case. You can work around this sometimes if you know enough about the structure of descendant nodes in the object graph to remove back references on serialization and replace them on deserialization. But that is not generally possible. This issue has been raised in JDK bug reports several times but was met with shrugs. I think given the vulnerability of default Java serialization this attitude is pretty irritating. We are left to implement our own general object serialization solution which is a daunting task, but open source alternatives exist.

One that I have come across and which appears to be of a reasonably high quality is Kryo by Esoteric Software.


You can actually view the referencing firsthand if you serialize your object to XML. The child objects are only serialized once. Any reference (anywhere in the serialized structure) to a child object that has already been serialized will simply point to that object in the file.

Serializing cyclic references can get a little messy, though, so you might want to avoid them if you can.

0

精彩评论

暂无评论...
验证码 换一张
取 消