回答
如果你看看java.io.ObjectStreamClass
那里你可以看到它实际上是被序列化的。下面的方法:
java.io.ObjectOutputStream.writeClassDescriptor(ObjectStreamClass)
调用它调用下面的方法的方法:
java.io.ObjectStreamClass.getSerialVersionUID()
在调用哪个要么计算serialVersionUID
或者使用一个类中声明,发现之前到以下方法:
java.io.ObjectStreamClass.getDeclaredSUID(Class)
所以看起来这个静态字段是一个例外,因为规则中没有对静态字段进行序列化。如何读取它here。
serialVersionUID不存储在“序列化”对象的实例中,因为它是一个静态字段(它是类的一部分,而不是对象的一部分)。
因此,如果编译的字节码是实际定义的,那么它是stored
,否则就是计算它。在java specification的词中:
如果类已经定义了serialVersionUID,它将从类中检索。如果serialVersionUID>未由类定义,则从虚拟机中类的定义计算。如果>指定的类不是可序列化或可外部化的,则返回null。
在Stream Unique Identifiers section中,说明了用于这种计算的算法。
这一段值得注意(这就是为什么当实现Serializable的类没有明确定义serialVersionUID时IDE通常会显示警告)。
注:强烈建议所有可序列化类中明确声明的serialVersionUID值,因为默认serialVersionUID的计算是对类的详细信息高度敏感,可能取决于编译器实现变化,从而可能导致在反序列化期间意外的serialVersionUID冲突,导致反序列化失败。
serialVersionUID
是序列化运行时使用的特殊字段。这些都在Java文档中描述为java.lang.Serializable
串行版本UID未存储在对象中;它是一个静态字段,因此它存储在类定义中。发生什么事是,当你序列化一个对象时,关于它的类的信息也必须被存储;否则将无法对对象进行序列化。存储在类中的信息包括其名称和它的序列版本UID。
你可以在这里阅读整个协议:http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html
总之,对于一个新的对象的条目都恰好是:
newObject:
TC_OBJECT classDesc newHandle classdata[]
这里classDesc
是类的描述符可以是一个宣言一个新的类,一个空引用或对之前声明的类的引用:
classDesc:
newClassDesc
nullReference
(ClassDesc)prevObject
新类的声明建立了类的名称和序列版本UID,可用于以后参考它的手柄,以及其他信息编码为classDescInfo
类:
newClassDesc:
TC_CLASSDESC className serialVersionUID newHandle classDescInfo
- 1. Java中的版本化序列化
- 2. 在eclipse中自动生成序列化版本uid
- 3. Java序列化不同的Java版本
- 4. EHCache和Java序列化版本控制
- 5. java序列化,serialVersionUID和类版本
- 6. 为什么序列化需要实现类中的串行版本UID?
- 7. Java Map/List序列化/反序列化与不同的Java版本?
- 8. ViewState和序列化对象版本化
- 9. 版本之间的序列化
- 10. Kryo:反序列化旧版本的类
- 11. (java)ObjectInputStream反序列化对象的错误版本
- 12. 序列化和反序列化实体框架版本
- 13. PHP序列化/反序列化qbasic版本
- 14. 在程序中读取java卡的UID
- 15. EJB远程方法中不匹配的序列化UID - java.util.date&DBTimestamp
- 16. 删除boost xml序列化版本
- 17. Boost序列化版本信息
- 18. Java中ArrayList的序列化
- 19. 使用多个版本的序列化程序类处理Java自定义序列化?
- 20. 排序版本化的ModelAdmin
- 21. 序列化对象在所有版本的java中是否兼容?
- 22. 为什么使用序列版UID的随机数?
- 23. 的Java序列化
- 24. 的Java序列化
- 25. Java序列化
- 26. Java序列化
- 27. Java序列化
- 28. 从文本文档中序列化/反序列化数组列表问题Java
- 29. Java。序列化的阵列
- 30. 序列化Java中的Java函数8
@downvoter:你能评价你downvote? – jalopaba 2012-06-12 08:37:48
“相对”downvote。必须确保Jiri的更好的答案在最前面(否则不会降低)。你完全忽略了这个问题的核心,那就是JVM如何知道序列化数据的版本(如果它的UID没有写入流中,那当然是,即使它是静态字段)。 – Thilo 2012-06-12 08:41:35