什么是串行版本UID用于?
这个问题在这里已经有了答案:
serialVersionUID
是Java序列化API黑魔法的一部分。
它用于唯一标识类的一个版本,以便在类被反序列化时,可以根据ClassLoader
加载的ClassLoader
的版本来检查版本。
如果没有指定序列化API,则序列化API本身会生成一个serialVersionUID
但是随后会因无关紧要的更改(或者至少不会破坏序列化兼容性)而随机更改。
通过自己添加字段,可以控制此过程 - 您可以决定何时对类进行更改会打破旧版本的反序列化。
更多信息可以在JavaDocs for Serializable
。
简而言之,如果你计划序列化这个类,然后将它反序列化 - 但是在对代码进行一些更改并重新编译之后 - 这个字段对于保证这将按预期工作或多或少是必不可少的。
Serializable
接口在这方面提供了足够的细节:
序列化运行时与每个可序列化类关联一个称为serialVersionUID
的版本号,在反序列化过程中使用该版本号来验证序列化对象的发送者和接收者是否已加载该对象的与序列化相容的类。 如果接收者已经为与对应的发送者类具有不同serialVersionUID
的对象加载了类,则反序列化将导致InvalidClassException
。 一个可序列化的类可以通过声明一个名为“serialVersionUID”的字段来声明自己的serialVersionUID
,该字段必须是static
, final
和long
类型的:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类没有显式声明serialVersionUID
,则序列化运行时将基于该类的各个方面计算该类的默认serialVersionUID
值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassExceptions
。 因此,要确保跨不同的java编译器实现保持一致的serialVersionUID
值,可序列化的类必须声明显式的serialVersionUID
值。
你也可以在Java对象序列化规范中阅读更多关于这方面的内容
searialVersionUID只是您放在界面上的一个版本号,以便知道它与相同的API进行通信。 换句话说,如果客户端的Java对象是“1L”而服务器是“2L”,那么它将引发一个不匹配错误。
链接地址: http://www.djcxy.com/p/23835.html