4

我无法理解SerializationJava 1.6 的基础知识。

下面是Dog包含类实例变量的Collar类:

狗.java

public class Dog implements Serializable {

private Collar collar;

public Collar getCollar() {
    return collar;
}

public void setCollar(Collar collar) {
    this.collar = collar;
}

}

Collar 类没有实现Serializable如下所示的接口:

领子.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();

请解释一下,在尝试实现所有理论内容时我完全感到困惑:(

4

2 回答 2

9

可能是因为你dog没有collar

尝试

Dog dog = new Dog();
dog.setCollar(new Collar());
于 2013-08-18T13:55:07.787 回答
2

看来您对对象图的概念有误解。在这个图中,节点是实例不是类),边是由引用类型的实例变量的值形成的。

应用于您的示例,

Dog dog = new Dog();

创建一个由单个节点组成的对象图,即Dog实例。该collar变量是null这样的,因此它的值不会形成边缘,也不会形成另一个节点。但是,如果您添加一行,例如

dog.setCollar(new Collar());

collar现在您的对象图包含两个节点,由实例变量中的值形成的边连接。

现在,所有这些应用于序列化意味着您发布的示例正在序列化单节点对象图,其所有节点都是可序列化的,但是如果您添加了一个衣领,该图将包含一个非序列化节点,您会得到异常预计。

于 2013-08-18T16:04:35.280 回答