在Java中一个对象可序列化的充分必要条件是:1.对象实现Serializable接口2.对象的父类必须有一个default constructor(即无参构造器)3.声明该类的修饰词必须为public 但是在测试代码的时候发现了如下问题(代码如下)
public class ClassB{
//ClassB 不能序列化,因为没有实现Serializable接口
private String str;
public ClassB(){
//default constructor
} public ClassB(String str){
this.str = str;
}
}
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;
}
}
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 ----------
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 秒) - 正常终止这是为什么呢?

解决方案 »

  1.   

    你自己不是在注释里面说的很清楚了吗:ClassB 不能序列化,因为没有实现 Serializable 接口这一点异常信息也说得很清楚啊。如果你想序列化 ClassC 对象,那么它的所有成员都必须能够序列化,除非用关键字屏蔽。
      

  2.   

    虽然你ClassC是序列化了, 但里面的一个变量是ClassB类型的, 也需要把ClassB序列化... 因为对一个类进行序列化的时候, 会递归的调用里面所有成员变量的序列化方法.
      

  3.   

    你们都说错了,成员变量不一定要全部可以序列化。
    如果我将outStream.writeObject(new ClassC("ricky"));改成outStream.writeObject(new ClassC());那么程序可以正常执行
      

  4.   

    NotSerializableException: ClassBClassB 没有实现Serializable接口 
      

  5.   

    如果将new ClassC()写入而不是将new ClassC("ricky")写入的话不会报错。这样你们还会说是成员也需要序列化吗?
      

  6.   

    为null的属性好像不用是否序可以序列化
      

  7.   

    new ClassC()的时候根本没对ClassB的实例赋值,也就是说,是默认值:null。
    我没有尝试过,但是我认为不报错也是可以理解的。
    有什么问题么?
      

  8.   

    要考虑的"属性值"是否可以序列化,null属性值是可以序列的,而非null属性值的时候,就要考虑这个对象能不能被序列化了
      

  9.   

    如果你用new ClassC()得到ClassC的实例后,再改变其b属性的值为:new ClassB()。你敢说格式化的时候不报错?
      

  10.   

    你把A的成员Class B给实例化然后再试试?成员变量是可以不一定要序列化,但是要加关键字transient。
      

  11.   

    2.对象的父类必须有一个default constructor(即无参构造器) 这个是反序列化才需要的,需要利用反射创建对象,如果没有无参构造,它怎么知道该给构造函数什么参数
      

  12.   

    如果说我将ClassC中的ClassB b 设置为transient 那么在执行对ClassC序列化的时候将会把ClassB的值清空咯?