java 对象序列化和对象反序列化操作时的版本兼容性问题
2015-07-28 09:26
381 查看
结合书和网上一些资料,现总结如下:
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:
private static final long serialVersionUID = 1L;(自己指定也可以)
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会自动给定两种生成的方式。如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名)(当变量变成其他类型,比如int s 变为 double s,会出现不兼容),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:
private static final long serialVersionUID = 1L;(自己指定也可以)
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会自动给定两种生成的方式。如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名)(当变量变成其他类型,比如int s 变为 double s,会出现不兼容),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。
相关文章推荐
- 设置Eclipse中的tab键为4个空格的完整方法
- Java会话(session)管理
- Java抽象类应用—模板方法模式
- Java中isAssignableFrom()方法与instanceof()方法用法
- Java内存溢出的详细解决方案[转载]
- java项目内存溢出解决方法
- 在Eclipse里自动导入相应包的类名的快捷键
- Spring MVC框架实例
- Java内存模型
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- java.lang.NoClassDefFoundError: org/slf4j/Logger
- java中的IO整理
- Java----多态
- java的jdbc简单封装方法
- event handling in Java
- eclipse里面INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误需要签名
- Java 编程下 Eclipse/myeclipse 如何设置单行代码显示的最大宽度
- java调用webservice接口的方法
- [Java]用递归与非递归的形式输出给定目录的所有文件名
- JVM中类的卸载机制