众所周知,如果您未能明确定义它,运行时将为您的类生成serialVersionUID字段。
但是有可能在runitme中获得这个值吗?是否有可能在运行时引用 .class ,获取它的serialVersionUID ?
答案 0 :(得分:16)
Integer i = new Integer(5);
long serialVersionID = ObjectStreamClass.lookup(i.getClass()).getSerialVersionUID();
以上是在运行时获取类的串行版本ID的示例代码。
答案 1 :(得分:2)
当然可以。 serialVersionUID
是一个常规静态变量,因此您可以在需要时访问它。唯一的问题是它通常定义为private
或protected
,因此您只能从类本身访问它。要从外部访问它,您可以使用反射:
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.有关正确的解决方案,请参见上文。