2011-05-06 12 views
6

Estaba pasando por this article para entender más sobre el proceso de serialización de Java. Cuando se trata de usos de readObject/writeObject pude ver dos casos de uso:Usos de readObject/writeObject en la serialización

  1. Podemos utilizar writeObject para cifrar el código de bytes antes de que se serializada. Desde el punto de vista de la seguridad, eso es bueno.
  2. podemos ejecutar readObject para ejecutar cualquier pieza específica de código que deba ejecutarse inmediatamente después de la deserialización, y fuera del curso de poin # 1, incluso podemos usar readObject para descifrar el código de bytes que se eliminó mientras se serializaba el objeto.

¿Hay algún otro escenario práctico que haya encontrado al serializar/deserializar objetos al escribir el método de lectura/escritura de objetos personalizado? ¿O si pudiera dirigirme a algún lugar donde pudiera ver algunos usos decentes y prácticos de readObject/writeObject?

+3

Pls actualizan el enlace al artículo. –

Respuesta

11

Los métodos personalizados readObject también son útiles cuando necesita inicializar campos transitorios (no serializados) después de que el objeto se ha deserializado.


Por cierto, echa un vistazo a Effective Java, Chapter 11 (no estoy seguro de lo que el número de capítulo/artículo esté en la 2ª ed.). Es una excelente lectura en serialización.

+4

'readResolve()' también se puede usar para este propósito. – biziclop

+0

En realidad lo hace ...Estaba buscando algunos comentarios sobre cómo exactamente se ha utilizado en su aplicación. Aunque la Serialización personalizada es una cosa elegante, pero la inicialización de variables estáticas o transitorias en readObject() suele utilizarse. – Vicky

+0

@Vicky: "en realidad lo hace", como en, el enlace Efectivo de Java responde a su pregunta? –

4

Podría haber varias razones para el uso de serialización personalizado:

  1. rendimiento.
  2. Interfaz con sistemas externos. (Más allá de su alcance o incluso simplemente sistemas que no son Java.)
  3. Necesitando un formato legible para las personas.
  4. Compatible con versiones anteriores de clases serializadas.

Por nombrar algunos, pero estoy seguro de que hay muchos más.

5

Puede implementar su propio objeto de lectura/objeto de escritura por razones de rendimiento o compatibilidad con versiones anteriores, o porque un campo que desea serializar no se puede serializar.

Para ver buenos ejemplos de readObject/writeObject, buscaría en la fuente que viene con el JDK. O probaría http://www.google.co.uk/search?q=readObject+writeObject+examples

3

El descifrado de I thing se puede hacer mejor utilizando un ObjectOutputStream basado en un CipherOutputsStream.

El uso más importante de writeObject/readObject es si desea mantener la serialización estable en múltiples revisiones de código. Su representación interna (variables miembro) puede cambiar, pero la serialización debe ser estable ya que hay un sistema antiguo con el que se comunica (por ejemplo, leyendo datos antiguos de archivos).

Pero prefiero la interfaz Externalizable para estos casos, ya que es más fácil de usar (no hay llamadas implícitas y métodos que solo el jvm conoce).

+0

Es esta la razón por la que (por ejemplo) [Implementación de LinkedList de Java] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/LinkedList .java # LinkedList.writeObject% 28java.io.ObjectOutputStream% 29) implementa los métodos writeObject/readObject? –

2
public class Employee implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private int empno; 
    private String ename; 
    private String job; 

    // setter & getter 

    @Override 
    public String toString() { 
     return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job 
       + "]"; 
    } 

    private void writeObject(ObjectOutputStream out) throws IOException { 

     // default serialization 
     // out.defaultWriteObject(); 

     // custom serialization 
     out.writeInt(empno); 
     out.writeUTF(ename); 
     // out.writeUTF(job); //job will not serialize 
    } 

    private void readObject(ObjectInputStream in) throws IOException, 
      ClassNotFoundException { 

     // default deSerialization 
     // in.defaultReadObject(); 

     // custom deSerialization 
     empno = in.readInt(); 
     ename = in.readUTF(); 
     // this.job = in.readUTF(); 
    } 

}