查找序列化对象的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();
}
}
我相信可以通过替换方法返回的描述符来读取所有序列化的数据,但是我还没有尝试过。