2012-09-16 15 views
6

Digamos que tengo una matriz arr de objetos del tipo A en la memoria, cada uno de los cuales tiene un campo de referencia apuntando al mismo objeto B.serialización de Java, Kryo y el gráfico de objetos

Ilustración:

A_1 A_2 A_3 ... A_N 
| | |  | 
| | V  | 
\--->\--> B <-----/ 

Tenga en cuenta que el campo de referencia en todos los objetos de tipo A puntos a la misma objeto de tipo B.

Ahora, serializo la matriz arr que contiene objetos del tipo A en un ObjectOutputStream. Luego deserializo los bytes obtenidos de esta manera.

Obtengo una nueva matriz arr1.

1) ¿El array arr1 tiene objetos de tipo A de tal manera que todos ellos apuntan a la misma objeto de tipo B? (No me refiero al mismo objeto antes de la serialización, sino a un objeto creado recientemente único del tipo B)

2) En otras palabras, ¿las llamadas serialize/deserialize en Java retienen el mismo gráfico objeto que antes de la serialización? (es decir, el gráfico del objeto recientemente deserializado es isomorfo al anterior)

3) ¿Dónde está esto documentado? (es decir, proporcione una cita)

4) Las mismas preguntas 1-3, pero aplicadas al marco de serialización Kryo para Java.

Gracias.

Respuesta

9

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

El mecanismo de serialización por defecto para un objeto escribe la clase de el objeto, la firma de clase, y los valores de todos los campos que no son transitorios y no estáticos. Las referencias a otros objetos (excepto en campos transitorios o estáticos) hacen que esos objetos también se escriban. Las referencias múltiples a un solo objeto se codifican utilizando un mecanismo de intercambio de referencia para que los gráficos de los objetos se puedan restaurar a la misma forma que cuando se escribió el original .

En cuanto a mi comprensión de la memoria, que se comparten referencias a objetos si las instancias de objeto para ser compartidos Pasar por el mismo ObjectOutputStream.

Así que cuando serializa la clase que contiene la matriz arr, cada objeto escrito obtiene una ID, y para cada referencia que pasa a través de la secuencia, solo se escribe esa ID. El gráfico deserializado en ese caso permanece homogéneo con el gráfico original.

Lo siento, pero no puedo ayudar con el mecanismo de serialización de la biblioteca de krio, me complacería mucho aprender de alguien que también lo usara.

EDITAR sobre kryo:

Parte de la documentación que encontré:

  • Por defecto, cada aparición de un objeto en el gráfico después de la primera se almacena como un ordinal número entero. Esto permite que se serialicen múltiples referencias al mismo objeto y gráficos cíclicos. Esto tiene una pequeña cantidad de sobrecarga y se puede desactivar para ahorrar espacio si no es necesaria: kryo.setReferences(false);

  • This (github) es el contrato de la resolución de referencia; dos aplicación son de aplicación: ArrayList a base de pequeños gráficos objetos, mapa-base para los más grandes

  • This consiste en la realización de la matriz de objeto por defecto (de) serializador

  • Las clases tienen que ser registrado para (de) publicación por entregas; cada clase registrado puede ser acoplado con un serializador (entre los cuales, el valor predeterminado Java serialización mechanism)

+0

A través de la misma 'ObjectOutputStream', o adicionalmente a través de la misma invocación del método' writeObject'? – axel22

+2

Solo a través de la misma transmisión; pensar en dos objetos haciendo referencia el uno al otro. Usted escribe el primero (y por lo tanto la referencia al segundo) en la secuencia. Cuando luego escribe el segundo en el mismo flujo, que tiene ID para ambos, las referencias se comparten. –

+0

¡Gracias por la gran respuesta! – axel22

Cuestiones relacionadas