在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 秒) - 正常终止这是为什么呢?
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 秒) - 正常终止这是为什么呢?
如果我将outStream.writeObject(new ClassC("ricky"));改成outStream.writeObject(new ClassC());那么程序可以正常执行
我没有尝试过,但是我认为不报错也是可以理解的。
有什么问题么?