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