手机版

java 正确使用序列化(6)

发布时间:2021-06-06   来源:未知    
字号:

外,从Java 的序列化规范里并没有指出当我们对类做了实质性的不兼容修改后反序
列化会有什么后果。并不是所有的不兼容修改都会引起反序列化的失败。比如,如果我们删
除了一个属性,则在反序列化的时候,反序列化机制只是简单的将该属性的数据丢弃。从
JDK 的参考里,我们可以得到一些不兼容的修改引起的后果如下表:
如何正确的使用Java序列化技术 技术研究系列
不兼容的修改 引起的反序列化结果
删除属性
(Deleting a field) Silently ignored
在一个继承或者实现层次里删除类
(Moving classes in inheritance
hierarchy)
Exception
添加静态/不可序列化属性
(Adding static/transient)
Silently ignored
修改基本属性类型
(Changing primitive type)
Exception
改变对默认属性值的使用
(Changing use of default field data)
Exception
在序列化和非序列化及内外部类之间切换
(Switching Serializable and
Externalizable)
Exception
删除Serializable或者Externalizable标志
(Removing Serializable or
Externalizable)
Exception
返回不兼容的类
(Returning incompatible class)
Depends on incompatibility
2.3 显示的控制对属性的序列化过程
在默认的Java 序列化机制里,有关对象属性到byte 流里的属性的对应映射关系都是自
动而透明的完成的。在序列化的时候,对象的属性的名称默认作为byte 流里的名称。当该
对象反序列化的时候,就是根据byte 流里的名称来对应映射到新生成的对象的属性里去的。
举个例子来说。在我们的一个Person对象序列化的时候,Person的一个属性firstName就作
为byte 流里该属性默认的名称。当该Person 对象反序列化的时候,序列化机制就把从byte
流里得到的firstName 的值赋值给新的Person 实例里的名叫firstName的属性。
Java的序列化机制提供了相关的钩子函数给我们使用,通过这些钩子函数我们可以精确
的控制上述的序列化及反序列化过程。ObjectInputStream的内部类GetField提供了对把属性
数据从流中取出来的控制,而ObjectOutputStream的内部类PutField则提供了把属性数据放
入流中的控制机制。就ObjectInputStream来讲,我们需要在readObject方法里来完成从流中
读取相应的属性数据。比如我们现在把Person 类的版本从下面的表一更新到表二:
/**
* 修改前的老版本Person类,为了简化,我们删除了所有无关的代码
*/
import java.io.*;
public class Person extends Humanoid
implements java.io.Serializable
{
private String lastName;
如何正确的使用Java序列化技术 技术研究系列
private String firstName;
private static final long serialVersionUID
=6921661392987334380L;
private Person()
{
}
public Person(String lastName, String firstName)
{
stName = lastName;

java 正确使用序列化(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)