查找序列化对象的serialVersionUID

paw*_*que 19 java serialization serialversionuid

有没有办法确定serialVersionUID序列化Java对象的生成?

问题是我序列化了一个对象而没有明确指定serialVersionUID.现在反序列化过程抱怨类不兼容.但是我并没有以一种使它不兼容的方式改变这个类.所以我假设serialVersionUID在类中指定它就足够了,因为它存储在对象数据中.为了做到这一点,我需要serialVersionUID从序列化数据中读取.

Kes*_*hav 22

有一种简单的方法可以找到一个类的serialversionUID-

假设你有一个你忘记提及serialversionUID的课程 -

import java.io.Serializable;

public class TestSerializable implements Serializable {

}
Run Code Online (Sandbox Code Playgroud)

这样做 -

serialver -classpath . TestSerializable
Run Code Online (Sandbox Code Playgroud)

这印刷品 -

static final long serialVersionUID = 5832063776451490808L;
Run Code Online (Sandbox Code Playgroud)

serialver是一个与JDK一起提供的实用程序

  • 但是,只有拥有TestSerializable类的旧版本时,这才有效.lewap的问题是他不知道serialVersionUID对于他序列化的对象类的旧版本有什么价值.如果他不再使用旧版本的课程,他就不能使用serialver来查找. (2认同)

Mar*_*ins 20

这对我有用:

long serialVersionUID = ObjectStreamClass.lookup(YourObject.getClass()).getSerialVersionUID();
Run Code Online (Sandbox Code Playgroud)

希望它也能帮到你.


McD*_*ell 12

您可以通过扩展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();
  }

}
Run Code Online (Sandbox Code Playgroud)

我相信通过替换方法返回的描述符可以读取所有序列化数据,但我还没有尝试过.


小智 5

存在与序列化位相关联的元数据(如果您愿意,可以使用标题).如果您知道它在哪个位置(SerialVersionUID与其他信息(如类名)一起写入),您可以从元数据中读取值.

我认为这篇文章可能对您有所帮助:Java序列化算法揭示了.

请注意,这些位是"明确地"写入的(除非您明确地对流进行了加密),因此您可能需要使用HEX编辑器才能看到它是什么SerialVersionUID.