tipos serializar serialización serializacion deserializacion como clase java serializable

java - serializar - serialversionuid



Si mi clase implementa Serializable, ¿tengo que implementarlo en sus subclases? (6)

Si tengo B extiende A ... y A implementa Serializable, ¿tengo que escribir "B implementos Serializable"?

Creo que no, pero me gustaría confirmación ...

también si pongo el ID de serialización en A ... ¿necesito poner uno en B también? ¿Se debe proteger la ID de serialización en A (no privada)?


En mi acuerdo con @azodious answer, la clase secundaria hereda las propiedades serializables de la clase primaria, pero tendrá que declarar serialVersionUID explícitamente.

De documentos de Java: https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

También se recomienda encarecidamente que las declaraciones explícitas de serialVersionUID utilicen el modificador privado siempre que sea posible, ya que dichas declaraciones se aplican solo a los campos de clase de declaración inmediata: serialVersionUID no son útiles como miembros heredados.


Marcar la identificación como protegida será suficiente desde la perspectiva del compilador. Sin embargo, en teoría, el punto del campo serialVersionUID en una clase Serializable es distinguir fácilmente las "versiones" de la clase al deserializarla, para indicar claramente cuándo un objeto dado puede ser deserializado en una instancia de la clase provista (si el serialVersionUID s son diferentes, se lanza una excepción). Si desea poder rastrear claramente las versiones y la naturaleza de un objeto, declare serialVersionUID en cada subclase.


No tiene que marcar explícitamente el derivado como Serializable, se heredará. Sin embargo, el serialVersionUID del padre, aunque heredado, no será utilizado por el proceso de serialización. Si no agrega un serialVersionUID al hijo, se generará uno.

Vea abajo:

public class A implements Serializable { protected static final long serialVersionUID = 1L; } public class B extends A { } public class Main { public static void main(String[] args){ A a = new A(); B b = new B(); Class aClass = a.getClass(); Class bClass = b.getClass(); long aUid = ObjectStreamClass.lookup(aClass).getSerialVersionUID(); long bUid = ObjectStreamClass.lookup(bClass).getSerialVersionUID(); System.out.printf("serialVersionUID:/n"); System.out.printf("b inherited from a: %d/n", b.serialVersionUID); System.out.printf("a used by serialization: %d/n",aUid); System.out.printf("b used by serialization: %d/n",bUid); } }

Salida:

serialVersionUID:

b heredado de a: 1

Una utilizada por serialización: 1

b utilizado por serialización: -3675232183873847366


No, porque B ya lo implementa a través de su clase base A. De eso se trata la herencia.


Sí. La subclase no necesita ser marcada como serializable explícitamente.

y, marcando id como protected lo hará. (desde la perspectiva del compilador)

Pero, como buena práctica, cada clase debe tener su propia serie serialVersionUid