¿Cuál es la diferencia entre Serializable
y Externalizable
en Java?
¿Cuál es la diferencia entre Serializable
y Externalizable
en Java?
Para agregar a las otras respuestas, mediante la implementación java.io.Serializable
, obtiene la capacidad de serialización "automática" para los objetos de su clase. No es necesario implementar ninguna otra lógica, simplemente funcionará. El tiempo de ejecución de Java utilizará la reflexión para descubrir cómo ordenar y desarmar sus objetos.
En versiones anteriores de Java, la reflexión era muy lenta, por lo que serializar gráficos de objetos grandes (por ejemplo, en aplicaciones RMI cliente-servidor) era un problema de rendimiento. Para manejar esta situación, java.io.Externalizable
se proporcionó la interfaz, que es similar java.io.Serializable
a los mecanismos escritos para realizar las funciones de clasificación y de clasificación (es necesario implementar readExternal
y writeExternal
métodos en su clase). Esto le brinda los medios para sortear el cuello de botella del rendimiento de la reflexión.
En versiones recientes de Java (1.3 en adelante, sin duda), el rendimiento de la reflexión es mucho mejor de lo que solía ser, por lo que este es un problema mucho menor. Sospecho que sería difícil obtener un beneficio significativo Externalizable
con una JVM moderna.
Además, el mecanismo de serialización Java incorporado no es el único, puede obtener reemplazos de terceros, como la serialización JBoss, que es considerablemente más rápida y es un reemplazo directo para el valor predeterminado.
Una gran desventaja Externalizable
es que debe mantener esta lógica usted mismo: si agrega, elimina o cambia un campo en su clase, debe cambiar sus métodos writeExternal
/ readExternal
para tenerlo en cuenta.
En resumen, Externalizable
es una reliquia de los días de Java 1.1. Realmente ya no es necesario.
Externalizable
es de gran ayuda .Externalizable
me queda mucho mejor, ya que no quiero generar matrices con espacios vacíos u objetos de marcador de posición, además de la interfaz explícita que puede manejar la herencia, lo que significa mi sub sincronizado -class puede agregar fácilmente el bloqueo alrededor de la llamada awriteExternal()
. Entonces, sí, Externalizable sigue siendo muy relevante, ciertamente para objetos grandes o complejos.La serialización proporciona una funcionalidad predeterminada para almacenar y luego recrear el objeto. Utiliza un formato detallado para definir el gráfico completo de los objetos que se almacenarán, por ejemplo, suponga que tiene una lista vinculada y codifica como se muestra a continuación, luego la serialización predeterminada descubrirá todos los objetos que están vinculados y se serializarán. En la serialización predeterminada, el objeto se construye completamente a partir de sus bits almacenados, sin llamadas de constructor.
Pero si desea una serialización restringida o no desea que una parte de su objeto se serialice, use Externalizable. La interfaz Externalizable extiende la interfaz Serializable y agrega dos métodos, writeExternal () y readExternal (). Estos se llaman automáticamente durante la serialización o deserialización. Al trabajar con Externalizable, debemos recordar que el constructor predeterminado debería ser público; de lo contrario, el código arrojará una excepción. Por favor, siga el siguiente código:
Aquí, si comenta el constructor predeterminado, el código arrojará la siguiente excepción:
Podemos observar que, como la contraseña es información confidencial, no la serializo en el método writeExternal (ObjectOutput oo) y no configuro el valor de la misma en readExternal (ObjectInput oi). Esa es la flexibilidad que proporciona Externalizable.
El resultado del código anterior es el siguiente:
Podemos observar que no estamos estableciendo el valor de passWord, por lo que es nulo.
Lo mismo también se puede lograr declarando el campo de contraseña como transitorio.
Espero eso ayude. Pido disculpas si cometí algún error. Gracias.
fuente
Diferencias clave entre
Serializable
yExternalizable
Serializable
es la interfaz de marcador sin ningún método.Externalizable
La interfaz contiene dos métodos:writeExternal()
yreadExternal()
.Serializable
interfaz. El proceso de serialización definido por el programador se iniciará para las clases que implementan laExternalizable
interfaz.Externalizable
interfaz. Puede admitir diferentes versiones de su objeto. Si implementaExternalizable
, es su responsabilidad serializar lasuper
claseSerializable
utiliza la reflexión para construir objetos y no requiere ningún constructor de argumentos. PeroExternalizable
exige un constructor público sin argumentos.Consulte el blog por
Hitesh Garg
para más detalles.fuente
La serialización usa ciertos comportamientos predeterminados para almacenar y luego recrear el objeto. Puede especificar en qué orden o cómo manejar referencias y estructuras de datos complejas, pero eventualmente se reduce al uso del comportamiento predeterminado para cada campo de datos primitivo.
La externalización se usa en los raros casos en los que realmente desea almacenar y reconstruir su objeto de una manera completamente diferente y sin usar los mecanismos de serialización predeterminados para los campos de datos. Por ejemplo, imagine que tiene su propio esquema único de codificación y compresión.
fuente
La serialización de objetos utiliza las interfaces serializables y externalizables. Un objeto Java solo es serializable. si una clase o cualquiera de sus superclases implementa la interfaz java.io.Serializable o su subinterfaz, java.io.Externalizable. La mayoría de la clase java son serializables .
NotSerializableException
:packageName.ClassName
«Para participar un objeto de clase en el proceso de serialización, la clase debe implementar una interfaz serializable o externa.Interfaz serializable
La serialización de objetos produce una secuencia con información sobre las clases de Java para los objetos que se están guardando. Para los objetos serializables, se mantiene suficiente información para restaurar esos objetos incluso si está presente una versión diferente (pero compatible) de la implementación de la clase. La interfaz serializable se define para identificar las clases que implementan el protocolo serializable:
InvalidClassException
«En el proceso de deserialización, si la clase local serialVersionUID valor de es diferente de la clase del remitente correspondiente. entonces resulta en conflicto comojava.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
Interfaz externalizable
Para los objetos externalizables, solo el contenedor guarda la identidad de la clase del objeto; la clase debe guardar y restaurar los contenidos. La interfaz externalizable se define de la siguiente manera:
OptionalDataException
«Los campos DEBEN ESTAR EN EL MISMO ORDEN Y TIPO tal como los escribimos. Si hay alguna discrepancia de tipo de la secuencia, arroja OpcionalDataException.Los campos de instancia de la clase que se escribieron (expuestos) para
ObjectOutput
serializarse.Ejemplo « implementa Serializable
Ejemplo « implementa Externalizable
Ejemplo
@ver
fuente
¡La interfaz externalizable en realidad no se proporcionó para optimizar el rendimiento del proceso de serialización! ¡pero para proporcionar medios para implementar su propio procesamiento personalizado y ofrecer un control completo sobre el formato y el contenido de la secuencia para un objeto y sus super tipos!
Ejemplos de esto es la implementación de comunicación remota AMF (formato de mensaje de ActionScript) para transferir objetos de script de acción nativos a través de la red.
fuente
https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html
La serialización predeterminada es algo detallada, y supone el escenario de uso más amplio posible del objeto serializado y, en consecuencia, el formato predeterminado (serializable) anota la secuencia resultante con información sobre la clase del objeto serializado.
La externalización le da al productor del flujo de objetos un control completo sobre los metadatos de clase precisos (si los hay) más allá de la identificación mínima requerida de la clase (por ejemplo, su nombre). Esto es claramente deseable en ciertas situaciones, como entornos cerrados, donde el productor de la secuencia de objetos y su consumidor (que reifica el objeto de la secuencia) coinciden, y los metadatos adicionales sobre la clase no sirven para nada y degradan el rendimiento.
Además (como señala Uri), la externalización también proporciona un control completo sobre la codificación de los datos en la secuencia correspondiente a los tipos de Java. Para un ejemplo (artificial), es posible que desee registrar boolean verdadero como 'Y' y falso como 'N'. La externalización te permite hacer eso.
fuente
Al considerar las opciones para mejorar el rendimiento, no olvide la serialización personalizada. Puede dejar que Java haga lo que hace bien, o al menos lo suficientemente bueno, de forma gratuita y proporcionar soporte personalizado para lo que hace mal. Esto suele ser mucho menos código que el soporte externo externo completo.
fuente
Existen muchas diferencias entre Serializable y Externalizable, pero cuando comparamos la diferencia entre Serializable personalizado (writeObject () y readObject () anulado y Externalizable, descubrimos que la implementación personalizada está estrechamente vinculada con la clase ObjectOutputStream donde, como en el caso de Externalizable, nosotros mismos proporcionar una implementación de ObjectOutput que puede ser la clase ObjectOutputStream o podría ser alguna otra como org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream
En caso de interfaz externalizable
He agregado un código de muestra para explicar mejor. Por favor, compruebe el caso de entrada / salida de objeto de Externalizable Estos no están vinculados a ninguna implementación directamente.
Donde como Outstream / Instream están estrechamente vinculados a las clases. Podemos extender ObjectOutputStream / ObjectInputStream pero será un poco difícil de usar.
fuente
Básicamente,
Serializable
es una interfaz de marcador que implica que una clase es segura para la serialización y la JVM determina cómo se serializa.Externalizable
contiene 2 métodosreadExternal
ywriteExternal
.Externalizable
permite que el implementador decida cómo se serializa un objeto, mientras queSerializable
serializa los objetos de la manera predeterminada.fuente
Algunas diferencias:
Para la serialización no hay necesidad de un constructor predeterminado de esa clase porque Object porque JVM construye lo mismo con la ayuda de Reflection API. En caso de externalización, se requiere un constructor sin arg, porque el control está en manos de programmar y luego asigna los datos deserializados al objeto a través de setters.
En la serialización, si el usuario desea omitir ciertas propiedades para ser serializadas, entonces tiene que marcar esas propiedades como transitorias, y viceversa, no es necesario para la externalización.
Cuando se espera soporte de compatibilidad con versiones anteriores para cualquier clase, se recomienda ir con Externalizable. La serialización admite la persistencia defaultObject y si la estructura del objeto está rota, causará problemas al deserializar.
fuente