2009-11-24 1 views
14

Например: Объект A содержит объект B, содержащий объект C, который содержит объект A.Работает ли Java Serialization для циклических ссылок?

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

Комментарий № 9 here указывает, что он не работает.

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

+0

Как я понимаю комментарий № 9, он говорит о трудностях реализации сериализуемости вручную, а не о недостатках официальной реализации. – meriton

+0

Да, я перечитываю, что, по-моему, я согласен, что это подразумевает от руки. – Brandon

+0

Что происходит, когда вы ** TRY **? –

ответ

14

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

+2

Есть ли какая-либо документация о том, как это работает ... Я хотел бы обработать это в одной из моих собственных реализаций сериализации. –

3

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

+1

Благодаря вашей ссылке «Особые случаи, такие как круговые ссылки и множественные ссылки на один объект, сохраняются таким образом, что при восстановлении древовидного графика новые объекты не волшебным образом появляются там, где должна быть ссылка на другой объект в дереве». http://java.sun.com/developer/technicalArticles/ALT/serialization/ – Brandon

0

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

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

1

Да, так оно и есть.

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

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

    }  
}