serializar serialización serializacion que programacion deserializacion como clase java serialization serialversionuid

java - serializacion - serialización en netbeans



Encontrar serialVersionUID de objeto serializado (9)

¿Hay una manera de determinar el serialVersionUID generado de un objeto Java serializado?

El problema es que serialVersionUID un objeto sin especificar explícitamente el serialVersionUID . Ahora el proceso de deserialización se queja de incompatibilidades de clase. Sin embargo, no cambié la clase de una manera que la hiciera incompatible. Así que asumo que es suficiente especificar el serialVersionUID en la clase tal como está almacenado en los datos del objeto. Para hacer esto, necesito leer el serialVersionUID de los datos serializados.


Eso es exactamente lo que debe hacer: especifique su propia static final long serialVersionUID .

Hay una sección al respecto en los documentos para Serializable .

A menos que haya especificado un serialVersionUID , no creo que haya una manera fácil de obtenerlo más que descifrar el flujo como sugiere @WMR.


Esto funciona para mí:

long serialVersionUID = ObjectStreamClass.lookup(YourObject.getClass()).getSerialVersionUID();

Espero que te ayude también.


Hay metadatos asociados con los bits serializados (un encabezado si lo desea). Puede leer el valor de los metadatos si sabe en qué posición se encuentra (el SerialVersionUID se escribe allí junto con otra información, como el nombre de la clase).

Creo que este artículo podría ayudarte: Se reveló el algoritmo de serialización de Java .

Tenga en cuenta que los bits están escritos "en claro" (a menos que haya cifrado explícitamente la transmisión), por lo que todo lo que necesita es un editor HEX para ver qué es el SerialVersionUID .



Hay una manera fácil de averiguar el serialversionUID de una clase

Supongamos que tiene una clase en la que ha olvidado mencionar serialversionUID-

import java.io.Serializable; public class TestSerializable implements Serializable { }

Solo haz esto-

serialver -classpath . TestSerializable

Esto imprime

static final long serialVersionUID = 5832063776451490808L;

Serialver es una utilidad que viene junto con JDK


La forma más fácil de obtenerlo (especialmente en casos difíciles de encontrar) es definir cualquier número para serialVersionUID y monitorear el seguimiento de la pila cuando la deserialización falla, imprimirá el original.


Puedes hacer esto extendiendo ObjectInputStream :

public class PrintUIDs extends ObjectInputStream { public PrintUIDs(InputStream in) throws IOException { super(in); } @Override protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { ObjectStreamClass descriptor = super.readClassDescriptor(); System.out.println("name=" + descriptor.getName()); System.out.println("serialVersionUID=" + descriptor.getSerialVersionUID()); return descriptor; } public static void main(String[] args) throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); List<Object> list = Arrays.asList((Object) new Date(), UUID.randomUUID()); oos.writeObject(list); oos.close(); InputStream in = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new PrintUIDs(in); ois.readObject(); } }

Creo que sería posible leer todos los datos serializados reemplazando el descriptor devuelto por el método, pero no lo he intentado.


hay una forma mucho más sencilla de obtener el serialVersionUID de un objeto serializado; simplemente deserialícelo con las utilidades de serialización de apache commons a la misma clase con una versión diferente de uid de serie y lea el mensaje de excepción que será más o menos:

org.apache.commons.lang.SerializationException: java.io.InvalidClassException: my.example.SerializableClass; clase local incompatible: secuencia classdesc serialVersionUID = -1, clase local serialVersionUID = -2


para desarrolladores de Android,

también puede habilitar la inspección de serialización desde Configuración -> Editor -> Inspecciones -> habilitar primero la "clase serializable sin verificación ''serialVersionUID", luego ALT + ENTRAR, el estudio creará serialVersionUID por usted.