首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

在不同的classloader其间进行对象的序列化和反序列化

2012-10-25 
在不同的classloader之间进行对象的序列化和反序列化在同一个classloader中,利用如下的方法serializabale

在不同的classloader之间进行对象的序列化和反序列化

在同一个classloader中,利用如下的方法serializabale和deserializable对象:

??ByteArrayOutputStream bo=new ByteArrayOutputStream();

??ObjectOutputStream oo=new ObjectOutputStream(bo);
??oo.writeObject(outObject);

?

?? ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
??ObjectInputStream oi=new ObjectInputStream(bi);
??Object inObject = oi.readObject();
??? 当序列化的对象和反序列化的对象不在同一个classloader中时,以上的代码执行时,就会报无法把属性付给对象的错误,此时应当,通过设置反序列化得classloader,来解决这个问题。

? 首先,从ObjectInputStream继承一个自己的ObjectInputStream:

public class CustomObjectInputStream extends ObjectInputStream {

?protected ClassLoader classLoader = this.getClass().getClassLoader();

?/**
? * @param in
? * @throws IOException
? */
?public CustomObjectInputStream(InputStream in) throws IOException {
??super(in);
??// TODO Auto-generated constructor stub
?}

?public CustomObjectInputStream(InputStream in, ClassLoader cl)
???throws IOException {
??super(in);
??// TODO Auto-generated constructor stub
??this.classLoader = cl;
?}

?/*
? * (non-Javadoc)
? *
? * @see java.io.ObjectInputStream#resolveClass(java.io.ObjectStreamClass)
? */
?@Override
?protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,
???ClassNotFoundException {
??// TODO Auto-generated method stub
??String name = desc.getName();
??try {
???return Class.forName(name, false, this.classLoader);
??} catch (ClassNotFoundException ex) {
???return super.resolveClass(desc);
??}
?}

}

然后在反序列化时,把序列化对象的classloader的传入:

?

?

ByteArrayOutputStream bo=new ByteArrayOutputStream();

ObjectOutputStream oo=new ObjectOutputStream(bo);
oo.writeObject(outObject);

?

???ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());

???CustomObjectInputStream oi=new CustomObjectInputStream(bi,outObject.getClass().getClassLoader());
??
???Object = oi.readObject();

?

热点排行