是否有可能在运行时获取java类的serialVersionUID

时间:2014-03-04 10:27:07

标签: java serialization

众所周知,如果您未能明确定义它,运行时将为您的类生成serialVersionUID字段。

但是有可能在runitme中获得这个值吗?是否有可能在运行时引用 .class 获取它的serialVersionUID

3 个答案:

答案 0 :(得分:16)

 Integer i = new Integer(5);
 long serialVersionID = ObjectStreamClass.lookup(i.getClass()).getSerialVersionUID();

以上是在运行时获取类的串行版本ID的示例代码。

答案 1 :(得分:2)

当然可以。 serialVersionUID是一个常规静态变量,因此您可以在需要时访问它。唯一的问题是它通常定义为privateprotected,因此您只能从类本身访问它。要从外部访问它,您可以使用反射:

Class<?> clazz = obj.getClass();
Field f = clazz.getDeclraredField("serialVersionUID");
f.setAccessible(true);
long uid = (long)f.getValue();

答案 2 :(得分:2)

  

我想要的:当我改变这些类的内部结构时,强制我的代码[自动]更改serialVersionUID

不,不。您希望永远保持serialVersionUID相同,并将内部更改限制为Serialization自动处理的内容,您需要查阅对象序列化规范的版本控制章节。改变每个班级变化的serialVersionUID是一个都市神话,遗憾的是,它已被广泛传播和接受。

您提出的解决方案也无效。 '跳过[a]类的旧版本的反序列化实例)不是任何解决方案。如果serialVersionUIDs不同意,序列化已经拒绝了它,但有例外。你之后做的任何事都已经太晚了。

这听起来像是一个XY问题。你想做X,你认为Y就是答案,所以当你应该询问X时,你会问Y.有关正确的解决方案,请参见上文。