【问题标题】:how to discover serialVersionUID of serialized objects如何发现序列化对象的serialVersionUID
【发布时间】:2012-01-12 18:36:58
【问题描述】:

小问题:如何发现序列化形式的对象的serialVersionUID。

详细信息:我在 Web 应用程序的会话数据库中有一些序列化版本的对象。对于其中一些对象,我未能在源代码中指定 serialVersionUID,因此 JVM 为我创建了一个。我想知道保存的对象的 serialVersionUID 是什么,以便我可以在我的源文件中对其进行硬编码。

我可以轻松读取序列化数据。我已经完成并删除了当前版本的代码无法读取的(旧)会话,因此我知道每个序列化对象都与当前代码库匹配。

【问题讨论】:

标签: java serialization


【解决方案1】:

由于您有数据,您可以简单地查看流中类名后面的八个八位字节,如 grammar for Java Serialization 所示

00000000: aced 0005 7372 0003 466f 6f00 0000 0000  ....sr..Foo.....
00000010: 0000 0102 0001 4c00 066d 794e 616d 6574  ......L..myNamet
00000020: 0012 4c6a 6176 612f 6c61 6e67 2f53 7472  ..Ljava/lang/Str
00000030: 696e 673b 7870 7400 044a 6f68 6e         ing;xpt..John

上面类的名字是“Foo”(没有包),serialVersionUID是1L。这是另一个例子:

00000000: aced 0005 7372 0011 7374 6163 6b6f 7665  ....sr..stackove
00000010: 7266 6c6f 772e 466f 6fff ffff ffff 7e3c  rflow.Foo.....~<
00000020: 1802 0001 4c00 066d 794e 616d 6574 0012  ....L..myNamet..
00000030: 4c6a 6176 612f 6c61 6e67 2f53 7472 696e  Ljava/lang/Strin
00000040: 673b 7870 7400 044a 6f68 6e              g;xpt..John

类名是 stackoverflow.Foo。如以下八位字节序列所示,serialVersionUID 为 0xff7e3c18:

ff ffff fffff 7e3c 18

现在您所要做的就是查看文件格式以找出您的对象在每种情况下的位置,并读取紧跟在 className 中的 serialVersionUID上面链接的语法。

【讨论】:

    【解决方案2】:

    对我有用的是使用 ObjectStreamClass.lookup(class)。

    我运行了一个反序列化数据库中所有会话对象的方法。然后我在我感兴趣的每个类上运行 ObjectStreamClass.lookup()。它为我提供了该类的 ObjectStreamClass 对象。 ObjectStreamClass 对象包含类名和 serialVersionUID。

    我将获取它的输出并相应地修改我的源文件。

    【讨论】:

    • 类的代码是否仍与数据库中所有序列化实例的代码相同?
    • 如果类确实发生了变化,那么 ObjectStreamClass.lookup() 可以抛出 java.io.InvalidClassException 如果类确实发生了变化。如果它没有改变,那么做任何这些都是没有意义的;只需使用serialver package.Class。你如何让课程传递给lookup()
    • ObjectStreamClass.lookup() 对我来说效果很好。为了获得类列表,我刚刚从包中提取了一个文件名列表,我知道该包中包含没有显式 serialVersionUID 的代码。
    • 是的,如果你有源代码(或旧的编译类)就可以了。
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2010-11-22
    • 2013-01-21
    • 2010-10-01
    • 1970-01-01
    • 2012-12-04
    • 2015-04-21
    • 2015-11-11
    相关资源
    最近更新 更多