2009-11-24 16 views
14

Por ejemplo: El objeto A contiene el objeto B que contiene el objeto C que contiene el objeto A.¿La serialización Java funciona para referencias cíclicas?

¿Objeto A serializar correctamente?

Comentario n. ° 9 here indica que no funciona.

Por el contrario, XStream indica que maneja las referencias cíclicas.

+0

mi modo de entender comentario # 9, que es hablar de la dificultad de implementar serializabilidad a mano, no se trata de defectos de la aplicación oficial. – meriton

+0

Sí, releyé que creo que acepto que implica a mano. – Brandon

+0

¿Qué sucede cuando ** TRY **? –

Respuesta

14

Sí, la serialización predeterminada de Java funciona para referencias cíclicas. Cuando serialice el objeto C, el campo contendrá una retro-referencia al objeto A ya serializado en lugar de serializarlo nuevamente.

+2

¿Hay alguna documentación sobre cómo funciona esto? Me gustaría manejar esto en una de mis propias implementaciones de serialización. –

3

Sí, la serialización de Java funciona para referencias circulares, lea here para obtener más información que le ayude a comprender qué puede hacer la serialización de Java.

+1

Gracias desde su enlace "Casos especiales como referencias circulares y múltiples referencias a un solo objeto se conservan de modo que cuando se vuelve a crear el árbol de árbol, los nuevos objetos no aparecen mágicamente donde debería estar una referencia a otro objeto en el árbol". http://java.sun.com/developer/technicalArticles/ALT/serialization/ – Brandon

0

En realidad, puede ver la referencia de primera mano si serializa su objeto a XML. Los objetos secundarios solo se serializan una vez. Cualquier referencia (en cualquier lugar de la estructura serializada) a un objeto secundario que ya ha sido serializado simplemente apunta a ese objeto en el archivo.

La serialización de referencias cíclicas puede ser un poco desordenada, por lo que es posible que desee evitarlas si puede.

1

Sí lo hace.

Hice esta prueba muy, muy simple, y al menos termina la serialización. Supongo que es correcto, pero puedes verificarlo con algunas líneas adicionales.

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

    }  
}