每当我们尝试serialize一个Class的对象时,我们总是有一个唯一的值serialVersionId作为私有final字段,它的意义是什么deserialization,我们可以使用它来检查对象和值是否已经以适当的方式反序列化?
它用于检查相同的类定义是否用于序列化以及DeSerialization.直接来自文档
序列化运行时将每个可序列化类与版本号相关联,称为serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送方和接收方是否已加载与该序列化兼容的该对象的类.如果接收者为具有与相应发送者类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException.可序列化类可以通过声明名为"serialVersionUID"的字段来显式声明其自己的serialVersionUID,该字段必须是static,final和long类型:
ANY-ACCESS-MODIFIER静态最终长serialVersionUID = 42L;
如果可序列化类未显式声明serialVersionUID,则序列化运行时将基于类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述.但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化期间可能导致意外的InvalidClassExceptions.因此,为了保证跨不同java编译器实现的一致的serialVersionUID值,可序列化类必须声明显式的serialVersionUID值.
另外,请查看Josh Bloch的书Effective Java(第2版):
自动生成的UID基于类名,已实现的接口以及所有公共成员和受保护成员生成.以任何方式更改任何这些都将更改serialVersionUID.因此,只有当您确定不会将一个以上版本的类序列化时(无论是跨进程还是稍后从存储中检索),您都不需要弄乱它们.
如果你现在忽略它们,并且稍后发现你需要以某种方式更改类但保持与旧版本类的兼容性,你可以使用JDK工具serialver在旧类上生成serialVersionUID,并显式设置在新课上.(根据您的更改,您可能还需要通过添加writeObject和readObject方法来实现自定义序列化 - 请参阅Serializable javadoc或上述第11章.)
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |