序列化初探

序列化ObjectOutputStream
java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream();
java.io.ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(object);// object:要序列化的对象
} catch (IOException e) {}

将对象序列化到输出流里(可以是文件流、字节流等等)
反序列化ObjectInputStream
从输入流中反序列化对象

java.io.ByteArrayInputStream bais =。。。;
java.io.ObjectInputStream ais;
try {
ais = new ObjectInputStream(bais);
Object bo = ais.readObject();
bs.setBo(bo);
}

ClassLoader相关序列化最重要的是反序列化时如何找到相关的class,这就涉及到反序列化的classloader机制。

ObjectInputStream通过resolveClass(ObjectStreamClass desc)方法去加载class,可以通过子类重写该方法加载class。Jsf中的反序列化重写了改方法,从当前线程加载。
ObjectInputStream
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException
{
String name = desc.getName();
try {

//不是通过当前线程来加载类的,指定了classloader
return Class.forName(name, false, latestUserDefinedLoader());
} catch (ClassNotFoundException ex) {
Class cl = (Class) primClasses.get(name);
if (cl != null) {
return cl;
} else {
throw ex;
}
}
}

Jsf

public class ApplicationObjectInputStream extends ObjectInputStream {
public ApplicationObjectInputStream(){
super();
}
public ApplicationObjectInputStream(InputStream in) {
super(in);
}
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
return Class.forName(desc.getName(),true,

Thread.currentThread().getContextClassLoader());

}
}

使用子类反序列化

ais = new ApplicationObjectInputStream(bais);

Object bo = ais.readObject();

对象自己管理序列化package java.io;

public class ObjectStreamClass implements Serializable {



由对象控制自己属性(属性的属性的属性…)的序列化和反序列化。
Class MyObject{

Private ClassXX aa;

000000

Private ClassYY bb;



private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

ois.defaultReadObject();//对aa、bb等属性进行反序列化

}

private void writeObject(ObjectOutputStream oos) throws IOException {

oos.defaultWriteObject();//对aa、bb等属性进行序列化
oos.writeObject(getTransactionManager());

oos.writeObject(getTransactionAttributeSource());

}

java.lang.InstantiationException
当序列化类的某些方法中使用了直接new的 abstract class,会导致对象反序列化时报
java.lang.InstantiationException异常。原因未知。


如下代码导致MyClass不能被反序列化
public class MyClass implements Serializable {

public void test(){

Hidden hidden=new Hidden() {
public Map nameValue() {
Map<String, String> deployMap = new HashMap<String, String>();
deployMap.put("name", ProcessForm.BO_DEPLOYMENT_ID);
deployMap.put("value", bussinessObjectContex
.getDeployment().getId());
return deployMap;
}
};

hidden.haha;
}



public abstract class Hidden{
public abstract void haha(){}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值