在同一个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();