【发布时间】:2013-08-20 10:09:43
【问题描述】:
我无法理解 Java 1.6 中 Serialization 的基础知识。
下面是Dog 类,其中包含Collar 类的实例变量:
Dog.java
public class Dog implements Serializable {
private Collar collar;
public Collar getCollar() {
return collar;
}
public void setCollar(Collar collar) {
this.collar = collar;
}
}
Collar类没有实现Serializable接口如下图:
Collar.java
public class Collar {
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
现在,当我尝试序列化 Dog 时,为什么它不抛出 NotSerializableException ?根据合同,整个对象图应该实现Serializable,但我的Collar 类没有实现。
下面是这个demo的主要方法:
public static void main(String[] args) {
try {
FileOutputStream fs = new FileOutputStream("E:\\test.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
Dog dog = new Dog();
// No exception thrown here, WHY?
// test.ser file is getting created properly.
os.writeObject(dog);
FileInputStream fis = new FileInputStream("E:\\test.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog dog1 = (Dog)ois.readObject();
// Here I am getting a null Collar object
Collar c1 = dog1.getCollar();
请解释一下,在尝试实现所有理论内容时我完全感到困惑:(
【问题讨论】:
-
请在阅读文件之前添加这些行
outputStream.flush();outputStream.close();,然后报告您的发现 -
您自己说过:整个对象图必须是可序列化的,而不是您的代码碰巧提到的所有类。
-
@Multithreader 如果我添加上面提到的两行,没有发现差异
-
好吧,您的整个对象图只是
Dog对象本身。它不包含对任何其他对象的引用。如果您将setCollar与非空参数一起使用,那么您将扩展对象图以包含该对象,并获得您期望的异常。 -
@WhoAmI 当您写信给
OutputStream时,您需要.close()它(它会执行.flush()甚至可能更多 - 不需要两者都执行)以确保任何缓冲的数据实际上是书面。没有你可能永远不会写最后几个字节,因此会读取损坏的数据。对于文件输出,您可能还需要同步:stackoverflow.com/questions/4072878/i-o-concept-flush-vs-sync
标签: java servlets web-applications serialization serializable