论坛首页 Java企业应用论坛

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

浏览 6028 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-01  
被序列化的对象:
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();
}
}

}
}

实在在是很费劲啊,不知是否有人遇到同样的问题,我知道根因
   发表时间:2011-11-02  
Student的writeObject方法呢?
0 请登录后投票
   发表时间:2011-11-03  
看这段没有格式化的代码更费劲
0 请登录后投票
   发表时间:2011-11-04  
public transient Map map;  去掉transient就可以了
0 请登录后投票
   发表时间:2011-11-04  
楼上的回答是正确的
0 请登录后投票
   发表时间:2011-11-05  
打了个D 写道
public transient Map map;  去掉transient就可以了

+1

transient  含义就是不参与序列化! 没试验过哈!
0 请登录后投票
   发表时间:2011-11-05  
7454103 写道
打了个D 写道
public transient Map map;  去掉transient就可以了

+1

transient  含义就是不参与序列化! 没试验过哈!


+1,为啥要对map加transient,而后又反序列化呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics