查找序列化对象的serialVersionUID

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

问题是我在没有明确指定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 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(); } } 

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

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

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

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

这样做 –

 serialver -classpath . TestSerializable 

这印刷品 –

 static final long serialVersionUID = 5832063776451490808L; 

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

这对我有用:

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

希望它也能帮到你。

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

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

请注意,这些位是“明确地”写入的(除非您明确加密了流),因此您可能只需要HEX编辑器即可查看SerialVersionUID是什么。

对象的序列化有一个指定的语法:

请参阅http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html中的第6.4章

使用它,您应该能够确定序列化对象的SerialVersionUID。

这正是你应该做的 – 指定你自己的static final long serialVersionUID

在Serializable的文档中有一节介绍它。

除非你已经指定了serialVersionUID否则我不相信除了解密流之外还有一个简单的方法来获取它,就像@WMR建议的那样。

有更简单的方法来获取序列化对象的serialVersionUID – 只需使用apache commons serialization utils将其反序列化为具有不同串行版本uid的相同类,并读取或多或少的exception消息:

org.apache.commons.lang.SerializationException:java.io.InvalidClassException:my.example.SerializableClass; 本地类不兼容:stream classdesc serialVersionUID = -1,本地类serialVersionUID = -2

在此处输入图像描述 对于Android开发者,

您还可以从设置 – >编辑器 – >检查 – >启用“Serializable class without’serialVersionUID’check”启用序列化检查,然后ALT + ENTER,工作室将为您创建serialVersionUID。

获取它的最简单方法(特别是难以找到的情况)是为serialVersionUID定义任意数字并在反序列化失败时监视堆栈跟踪,它将打印出原始数据。