当前位置: 代码迷 >> J2SE >> 关于对象序列化的有关问题
  详细解决方案

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

热度:133   发布时间:2016-04-24 01:51:09.0
关于对象序列化的问题
在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属性值的时候,就要考虑这个对象能不能被序列化了
  相关解决方案