Работает ли Java Serialization для циклических ссылок?

Например: Object A содержит объект B, содержащий объект C, содержащий объект A.

Будет ли сериализован объект Object?

Комментарий # 9 здесь указывает, что он не работает.

Напротив, XStream указывает, что он обрабатывает циклические ссылки.

Ответы

Ответ 1

Да, стандартная сериализация Java работает для циклических ссылок. Когда вы сериализуете объект C, это поле будет содержать обратную ссылку на уже сериализованный объект A, а не сериализовать его снова.

Ответ 2

Да, сериализация Java работает для циклических ссылок, читайте здесь для получения дополнительной информации, чтобы помочь вам понять, что может делать сериализация Java.

Ответ 3

Да, да.

Я сделал этот очень, очень простой тест и, по крайней мере, закончил сериализацию. Я предполагаю, что это правильно, но вы можете проверить это с помощью некоторых дополнительных строк.

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");

    }    
}

Ответ 4

Фактически вы можете просмотреть ссылки, если вы сериализуете свой объект в XML. Дочерние объекты только сериализованы один раз. Любая ссылка (в любом месте сериализованной структуры) на дочерний объект, который уже был сериализован, просто укажет на этот объект в файле.

Сериализация циклических ссылок может немного запутаться, поэтому вы можете избежать их, если сможете.