java 序列化的一个问题,一个方法导致序列化失败,找根因,请看代码注释

被序列化的对象:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Student implements Serializable {

/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;

public List list;

public transient Map map;

public String a = "hhh";

public Age age;

public String b;

private Map attributes;

        /**
           就是有由于这个方法导致序列化失败,报java.io.OptionalDataException
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1267)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
   at Student.readObject(Student.java:29)异常
        **/
private void readObject(ObjectInputStream ois) throws IOException,
ClassNotFoundException {
ois.defaultReadObject();
attributes = (Map) ois.readObject();//将它注释掉以后就能通了
}
}
=========================我是风格符号===================================================================
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
//序列化代码,就是个深克隆
public class Copy {
public static Student deepCopyPageCom(Student pageCom) {
Student stu = null;
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(pageCom);

bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
stu = (Student) ois.readObject();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
closeAllStream(baos, oos, bais, ois);
}
return stu;
}

/**
* 关闭所有输入输出流
*
* @param baos
* @param oos
* @param bais
* @param ois
* @see [类、类#方法、类#成员]
*/
private static void closeAllStream(ByteArrayOutputStream baos,
ObjectOutputStream oos, ByteArrayInputStream bais,
ObjectInputStream ois) {
if (null != baos) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != oos) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();

}
}
if (null != bais) {
try {
bais.close();
} catch (IOException e) {
e.printStackTrace();

}
}
if (null != ois) {
try {
ois.close();
} catch (IOException e) {

e.printStackTrace();
}
}

}
}

实在在是很费劲啊,不知是否有人遇到同样的问题,我想知道根因,jar包中引用到的类中有个方法被别人删掉了吗。

你可能感兴趣的:(Java综合)