0

我读到“序列化不适用于静态元素”——但下面的一个简单示例告诉我并非如此。

class superparent implements Serializable {
    int data = 0;

    public superparent(int data) {
        this.data = data;
    }

    public int getdata() {
        return data;
    }
}

public class statichost implements Serializable {
    int member = 0;
    public static superparent s = new superparent(20);

    public statichost(int data) {
        this.member = data;
    }

    public static void main(String[] args) {
        statichost c = new statichost(6);
        try {
            FileOutputStream fs = new FileOutputStream("testSer.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(c);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            FileInputStream fis = new FileInputStream("testSer.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            c = (statichost) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("after: contained data is " + c.s.getdata());
    }
}

根据上面的语句,当我期望 0 时,输出会打印 20。我错过了什么吗?

4

3 回答 3

2

这是因为你int data=0;不是你的类的静态成员superparent

另外我想指出,如果你忘记了这个建议,类名应该以大写字母开头

于 2012-11-26T06:00:54.470 回答
2

这里没有什么特别的事情发生。您已经为您的类声明了一个静态成员变量statichost。这个变量在类被 JVM 加载时初始化,不管是什么触发了类的加载。

序列化和反序列化statichost实例与静态字段无关,因为它们与您的类相关联,而不是与您的实例相关联。如果您想对此进行测试,请将序列化和反序列化分解为不同的块并执行以下步骤:

  • 序列化您的statichost实例
  • 更改类,使其superparent初始化为 15,而不是 20
  • 反序列化statichost实例

如果静态字段被序列化,您希望c.s.getdata()报告 20,但它会报告 15。

于 2012-11-26T06:10:01.890 回答
0

我认为您的测试代码无法验证这种情况。因为 20 是public static superparent s=new superparent(20);在类初始化时设置的,所以在类加载时它总是被 JVM 设置为 20。

如果您希望初始数据为 0 并检查数据到 20 的修改不能被序列化,然后尝试

  1. 使用public static superparent s=new superparent(0);而不是 20 作为初始值。
  2. 注释掉第一次执行的readObject try-catch块,在第一个try-catch块中添加修改代码csdata=20写入文件,然后执行代码。
  3. 注释掉第二次执行的 writeObject try-catch 块,再次执行读取的 Object 代码。然后可以看到20不能序列化成文件,打印0。
于 2012-11-26T06:19:33.393 回答