查找序列化对象的serialVersionUID


问题内容

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

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


问题答案:

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

}

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