java序列化相关总结

来源:互联网 发布:网络配音培训班 编辑:程序博客网 时间:2024/05/16 05:47

参考:

http://developer.51cto.com/art/201202/317181.htm

http://blog.csdn.net/jiangwei0910410003/article/details/18989711

http://www.2cto.com/kf/201405/305380.html

http://blog.csdn.net/linghu_java/article/details/25194821


需要关注的问题:

1.java实现序列化两种方式,serializable接口和externalizable接口的区别

可参看http://developer.51cto.com/art/201202/317181.htm

使用Externalizable进行序列化时,当读取对象时,会调用被序列化类的无参构造器去创建一个新的对象,然后再将被保存对象的字段的值分别填充到新对象中。这就是为什么在此次序列化过程中Person类的无参构造器会被调用。由于这个原因,实现Externalizable接口的类必须要提供一个无参的构造器,且它的访问权限为public。


2.序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),区别。

http://blog.csdn.net/jiangwei0910410003/article/details/18989711

反序列化成功满足:

---代码不同,序列化id相同,可以反序列化成功。

---序列化id不同,反序列化失败,报如下错误。

java.io.InvalidClassException: org.test.serializable.model.User; local class incompatible: stream classdesc serialVersionUID = 1948936500401777650, local class serialVersionUID = 5717779435831415911


序列化id的作用

http://blog.csdn.net/linghu_java/article/details/25194821

凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量:private static final long serialVersionUID; 类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID。显式地定义serialVersionUID有两种用途: 

  1)在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。 


  2)当你序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。 






0 0