¿La serialización conserva la identidad del objeto?

Estoy usando el javaSerializable interfaz y laObjectOutputStream para serializar objetos (hasta ahora, este método ha sido suficiente para mis propósitos).

Mi API se basa en la identidad del objeto para algunas operaciones y me pregunto si se mantendrá mediante la serialización. Es decir:Si, por dos objetos arbitrarios.a yb, se mantienea == b antes de la serialización, ¿se mantiene después de la deserialización?

He encontrado algunos textos quereclamar lo contrario - pero o escribieron sobre una versión anterior del JRE (solo estoy interesado en 1.6 y quizás 1.5), o estaban preocupados por el RMI (que no es relevante para mí).

losdocumentación no es muy próximo con respecto a la identidad del objeto. UNAarticulo tecnico en sun.com menciona queObjectOutputStream utiliza el almacenamiento en caché de los objetos, lo que para mí solo tiene sentido si la identidad del objeto se conserva, pero no tengo la confianza suficiente para confiar en esta evidencia endeble.

Lo probé (Java 1.6, OS X) y encontré que, La identidad de los objetos permanece sin cambios por la serialización.. ¿Pero puedo extrapolar de estos resultados o son poco confiables?

Para mi prueba, he serializado el siguiente gráfico de objetos:

C----------+
| b1    b2 |
+----------+
  |      |
  v      v
B---+  B---+
| a |  | a |
+---+  +---+
   \    /
    \  /
     \/
   A----+
   |    |
   +----+

Un código mínimo de reproducción:

import java.io.*;

public class SerializeTest {
    static class A implements Serializable {}

    static class B implements Serializable {
        final A a;

        public B(A a) {
            this.a = a;
        }
    }

    static class C implements Serializable {
        final B b1, b2;

        public C() {
            A object = new A();
            b1 = b2 = new B(object);
        }
    }

    public static void main(String[] args) throws IOException,
            ClassNotFoundException {
        C before = new C();
        System.out.print("Before: ");
        System.out.println(before.b1.a == before.b2.a);

        // Serialization.
        ByteArrayOutputStream data = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(data);
        out.writeObject(before);
        out.close();

        // Deserialization.
        ObjectInputStream in =
            new ObjectInputStream(new ByteArrayInputStream(data.toByteArray()));
        C after = (C) in.readObject();
        System.out.print("After: ");
        System.out.println(after.b1.a == after.b2.a);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta