日期:2014-05-20  浏览次数:20806 次

关于对象序列化的问题
在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属性值的时候,就要考虑这个对象能不能被序列化了