手机版

java 正确使用序列化(4)

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

里实现一
如何正确的使用Java序列化技术 技术研究系列
个writeObject方法,这个方法在ObjectOutputStream序列化该对象的时候就会自动的回调它。
从而完成我们自定义的序列化功能。
同样的,反序列化的类也实现了同样的回调机制,我们通过扩展其readObject来实现自
定义的反序列化机制。
通过这种灵活的回调机制就解决了上面提出的序列化带来的问题,针对上面的Person
的问题,我们编写如下的readObject方法就可以彻底避免population计数不准确的问题:
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException
{
ois.defaultReadObject();
synchronized (Person.class)
{
population++;
}
System.out.println("Adjusting population in readObject");
}
2.2 序列化过程的类版本控制
本节讨论以下问题:
u 在对象反序列化过程中如何寻找对象的类;
u 如果序列化和反序列化两边的类不是同一个版本,如何控制;
2.2.1 序列化类的寻找机制
在对象的反序列化过程中,是一定需要被反序列化的类能被ClassLoader 找到的,否则
在反序列化过程中就会抛出ng.ClassNotFoundException 异常。关于ClassLoader 如何
寻找类,这里就不多说了,可以参考我的另一篇讨论ClassLoader 的文章《在非管理环境下
如何实现热部署》。我们这里只是关心该序列化对象对应的类是被哪个ClassLoader 给Load
的。为此,我们修改上面的
/**
* 修改后的反序列化类
*/
import java.io.*;
public class ReadInstance
{
public void readPerson(String filename)
{
如何正确的使用Java序列化技术 技术研究系列
try{
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();
System.out.println("read object " + o);
System.out.println(this.getClass().getClassLoader());
Person person = (Person)o;
System.out.println(person.getClass().getClassLoader());
}catch(java.io.IOException ie)
{
ie.printStackTrace();
}catch(ClassNotFoundException ce)
{
ce.printStackTrace();
}
}
public static void main(String [] args) throws Exception
{
if (args.length != 1)
{
System.out.println("usage: java ReadInstance filename");
System.exit(-1);
}
ReadInstance readInstance = new ReadInstance();
readInstance.readPerson(args[0]);
}
我们主要通过背景为黄色的两行代码查看其类加载器,运行结果如下:
由此可以看出,序列化类的类加载器正式其反序列化实现类的类加载器。
这样的话我们
就可以通过使最新的Person 类的版本发布为只有该反序列化器的ClassLoader可见。而较旧
的版本则不为该ClassLoader 可见的方法来避免在反序列化过程中类的多重版本的问题。当
然,下面就类的版本问题我们还要做专门的探讨。
如何正确的使用Java序列

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