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

关于对象序列化的有关问题

2012-03-08 
关于对象序列化的问题在Java中一个对象可序列化的充分必要条件是:1.对象实现Serializable接口2.对象的父类

关于对象序列化的问题
在Java中一个对象可序列化的充分必要条件是:

1.对象实现Serializable接口

2.对象的父类必须有一个default constructor(即无参构造器)

3.声明该类的修饰词必须为public

 

但是在测试代码的时候发现了如下问题(代码如下)

Java code
public class ClassB{    //ClassB 不能序列化,因为没有实现Serializable接口    private String str;    public ClassB(){        //default constructor    }    public ClassB(String str){        this.str = str;    }}

Java code
import java.io.Serializable;public class ClassC implements Serializable{    private ClassB b;    public ClassC(){        //default constructor    }    public ClassC(String str){        b = new ClassB(str);    }    public ClassB getClassB(){        return b;    }}

Java code
import java.io.File;import java.io.FileOutputStream;import java.io.FileInputStream;import java.io.BufferedOutputStream;import java.io.BufferedInputStream;import java.io.ObjectOutputStream;import java.io.ObjectInputStream;public class Test{    public static void main(String[] args)throws Exception{        File file = new File("aa.bin");        ObjectOutputStream outStream = new ObjectOutputStream(            new BufferedOutputStream(            new FileOutputStream(file)));        outStream.writeObject(new ClassC("ricky"));        outStream.close();        ObjectInputStream inStream = new ObjectInputStream(            new BufferedInputStream(            new FileInputStream(file)));        inStream.readObject();    }}

发现执行Test的时候会抛出异常
Java code
---------- java ----------Exception in thread "main" java.io.NotSerializableException: ClassB    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)    at Test.main(Test.java:15)输出完成 (耗时: 3 秒) - 正常终止

这是为什么呢?

[解决办法]
这个类可序列化,当然要求它的成员能序列化。
因为序列化肯定是递归进行的。
试想,如果文件中存在不可保存的字符,那整个文件应该如何保存呢?
[解决办法]
要考虑的"属性值"是否可以序列化,null属性值是可以序列的,而非null属性值的时候,就要考虑这个对象能不能被序列化了

热点排行