tipos referenciados primitivos objeto ejemplos ejemplo datos java serialization java-8

primitivos - tipos de datos referenciados en java



¿Por qué no deberían ser serializadas las clases basadas en valores de Java? (2)

Piense qué sucede cuando el gráfico de objetos que se está serializando tiene un ciclo. El algoritmo de serialización entraría en un bucle sin fin en tal caso, a menos que tenga un mecanismo específico para detectar y resolver ciclos. Todos sabemos que la serialización de Java permite gráficos de objetos cíclicos, por lo tanto, el mecanismo está ahí.

Ahora considere la definición de un ciclo: el gráfico contiene un objeto que es alcanzable desde sí mismo. Esa definición se refiere a la identidad del objeto, lo que significa que el mecanismo debe considerar la identidad del objeto para rastrear los ciclos. En el nivel de implementación, esto se logra manteniendo un IdentityHashMap de todas las instancias vistas, y esa clase se basa en Object.identityHashCode() .

La oración que cita explica cómo se resolverá este problema en una versión futura de Java: a los tipos de valores se les dará un tratamiento especial, de modo que la detección del ciclo dependerá de sus propios métodos equals y hashCode lugar de == y identityHashCode .

Desde la versión 8 Java tiene el concepto de clases basadas en valores . Esto está en preparación de una versión futura que probablemente permitirá la definición de tipos de valor . Ambas definiciones / descripciones mencionan la serialización (negrita agregada por mí):

Acerca de las clases basadas en valores existentes:

Un programa puede producir resultados impredecibles si intenta distinguir dos referencias a valores iguales de una clase basada en valores, ya sea directamente a través de la igualdad de referencia o indirectamente a través de una apelación a la sincronización, hashing de identidad, serialización o cualquier otro mecanismo sensible a la identidad.

Sobre futuros tipos de valor:

El código hash basado en la identidad predeterminado para el objeto, disponible a través de System.identityHashCode, tampoco se aplica a los tipos de valor. Las operaciones internas, como la serialización, que hacen distinciones de objetos basadas en la identidad, o bien no se aplicarían a los valores (ya que no se aplican a las primitivas) o utilizarían la distinción basada en valores proporcionada por el método hashCode del tipo de valor.

Debido a que las futuras implementaciones de JVM podrían no usar encabezados de objetos e indicadores de referencia para clases basadas en valores, algunas de las limitaciones son claras. (Por ejemplo, no bloquear una identidad que la JVM no debe mantener. Una referencia en la que está bloqueada podría eliminarse y reemplazarse por otra más adelante, lo que hace que la liberación del bloqueo no tenga sentido y causará puntos muertos).

Pero no entiendo cómo la serialización juega en esto. ¿Por qué se considera un "mecanismo sensible a la identidad" ? ¿Por qué "hace distinciones de objetos basadas en la identidad" ?


La serialización utiliza System.identityHashCode (a través de IdentityHashMap ) para garantizar que la topología del gráfico de objetos resultante de la deserialización sea topológicamente equivalente a la del gráfico de entrada.