¿Cuándo debemos implementar la interfaz serializable?

153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. ¿Cuándo debo implementar la Serializableinterfaz?
  2. ¿Por qué hacemos eso?
  3. ¿Da alguna ventaja o seguridad?
theJava
fuente
1
Para su información, la respuesta aceptada aquí es incompleta y engañosa, ya que no aborda los inconvenientes de seguridad. Consulte Java eficaz , elemento 86: Implemente Serializable con gran precaución. La respuesta de Raedwald aquí diciendo que no usar serialización es la correcta.
Nathan Hughes

Respuestas:

157
  1. ¿ De qué se trata esta cosa de "serialización"? :

    Le permite tomar un objeto o grupo de objetos, ponerlos en un disco o enviarlos a través de un mecanismo de transporte inalámbrico o por cable, luego, tal vez en otra computadora, invierta el proceso: resucite los objetos originales. Los mecanismos básicos son aplanar objeto (s) en un flujo unidimensional de bits y convertir ese flujo de bits nuevamente en el objeto (s) original (es).

    Al igual que el Transporter en Star Trek, se trata de tomar algo complicado y convertirlo en una secuencia plana de 1s y 0s, luego tomar esa secuencia de 1s y 0s (posiblemente en otro lugar, posiblemente en otro momento) y reconstruir el complicado original " alguna cosa."

    Por lo tanto, implemente la Serializableinterfaz cuando necesite almacenar una copia del objeto, envíela a otro proceso que se ejecute en el mismo sistema o en la red.

  2. Porque quieres almacenar o enviar un objeto.

  3. Facilita el almacenamiento y el envío de objetos. No tiene nada que ver con la seguridad.

moinudin
fuente
44
¿Es una buena práctica implementar una interfaz seriamente visible para todos los modelos de dominio ...
TheJava
8
@theJava No se trata de las mejores prácticas. Se trata de si necesita o no series de bytes.
moinudin
55
Cuando use JSON, no tiene que implementar esta interfaz y simplemente puede enviar esa cadena ... así que todavía no estoy seguro de por qué usar esta interfaz cuando puede usar JSON.
Yonatan Nir
1
@YonatanNir No estoy seguro de por qué uno usaría JSON cuando MsgPack, Avro, Thrift o Protobuf son mejores para la transferencia de E / S.
OneCricketeer
1
@YonatanNir Un esquema estrictamente definido es mejor. Y JSON está destinado a ser legible por humanos, mientras que los formatos codificados en binario son mucho más eficientes a través del cable
OneCricketeer
48
  1. Implemente la Serializableinterfaz cuando desee poder convertir una instancia de una clase en una serie de bytes o cuando crea que un Serializableobjeto puede hacer referencia a una instancia de su clase.

  2. Serializable Las clases son útiles cuando desea persistir instancias de ellas o enviarlas por cable.

  3. Las instancias de Serializableclases se pueden transmitir fácilmente. Sin embargo, la serialización tiene algunas consecuencias de seguridad. Lea el Java efectivo de Joshua Bloch .

Steve Emmerson
fuente
32

La respuesta a esta pregunta es, quizás sorprendentemente, nunca , o de manera más realista, solo cuando se ve obligado a la interoperabilidad con el código heredado . Esta es la recomendación en Effective Java, 3rd Edition de Joshua Bloch:

No hay ninguna razón para usar la serialización Java en ningún sistema nuevo que escriba

El arquitecto jefe de Oracle, Mark Reinhold, dice que eliminar el actual mecanismo de serialización de Java es un objetivo a largo plazo.


Por qué la serialización de Java es defectuosa

Java proporciona como parte del lenguaje un esquema de serialización al que puede optar, utilizando la Serializableinterfaz. Sin embargo, este esquema tiene varias fallas intratables y los diseñadores del lenguaje Java deberían tratarlo como un experimento fallido.

  • Fundamentalmente pretende que uno puede hablar sobre la forma serializada de un objeto. Pero hay infinitos esquemas de serialización, lo que resulta en infinitas formas serializadas. Al imponer un esquema, sin ninguna forma de cambiar el esquema, las aplicaciones no pueden usar el esquema más apropiado para ellos.
  • Se implementa como un medio adicional para construir objetos, lo que evita cualquier verificación de precondición que realicen sus constructores o métodos de fábrica. A menos que se escriba un código de deserialización extra complicado, propenso a errores y difícil de probar, es probable que su código tenga una gran debilidad de seguridad.
  • Probar la interoperabilidad de diferentes versiones del formulario serializado es muy difícil.
  • El manejo de objetos inmutables es problemático.

Que hacer en su lugar

En su lugar, use un esquema de serialización que pueda controlar explícitamente. Tales como Protocol Buffers, JSON, XML o su propio esquema personalizado.

Raedwald
fuente
2
no es un gran experto en ese nivel, pero siento que tienes razón.
furia nocturna
1
¡Creo que es la mejor respuesta!
jjanczur