¿Cuál es la diferencia entre Serializabley Externalizableen Java?
¿Cuál es la diferencia entre Serializabley Externalizableen 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.Externalizablese proporcionó la interfaz, que es similar java.io.Serializablea los mecanismos escritos para realizar las funciones de clasificación y de clasificación (es necesario implementar readExternaly writeExternalmé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 Externalizablecon 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 Externalizablees que debe mantener esta lógica usted mismo: si agrega, elimina o cambia un campo en su clase, debe cambiar sus métodos writeExternal/ readExternalpara tenerlo en cuenta.
En resumen, Externalizablees una reliquia de los días de Java 1.1. Realmente ya no es necesario.
Externalizablees de gran ayuda .Externalizableme 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
SerializableyExternalizableSerializablees la interfaz de marcador sin ningún método.ExternalizableLa interfaz contiene dos métodos:writeExternal()yreadExternal().Serializableinterfaz. El proceso de serialización definido por el programador se iniciará para las clases que implementan laExternalizableinterfaz.Externalizableinterfaz. Puede admitir diferentes versiones de su objeto. Si implementaExternalizable, es su responsabilidad serializar lasuperclaseSerializableutiliza la reflexión para construir objetos y no requiere ningún constructor de argumentos. PeroExternalizableexige un constructor público sin argumentos.Consulte el blog por
Hitesh Gargpara 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 = 50818771Interfaz 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
ObjectOutputserializarse.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,
Serializablees una interfaz de marcador que implica que una clase es segura para la serialización y la JVM determina cómo se serializa.Externalizablecontiene 2 métodosreadExternalywriteExternal.Externalizablepermite que el implementador decida cómo se serializa un objeto, mientras queSerializableserializa 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