Java 静态成员序列化

Java 静态成员序列化,java,serialization,Java,Serialization,我读到“序列化不适用于静态元素”——但下面的一个简单示例告诉我不是这样 class superparent implements Serializable { int data = 0; public superparent(int data) { this.data = data; } public int getdata() { return data; } } public class statichost im

我读到“序列化不适用于静态元素”——但下面的一个简单示例告诉我不是这样

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。
我遗漏了什么吗?

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


我还想指出,如果您忘记了这个建议,类名应该以大写字母开头,这是因为您的
int data=0
不是类的静态成员
superparent


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

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

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

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

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

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

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

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

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

我认为您的测试代码无法验证这种情况。 因为20是由
publicstaticsuperparent s=newsuperparent(20)设置的
在类初始化中,JVM在类加载时总是将其设置为20

如果希望初始数据为0,并检查无法序列化将数据修改为20,请重试

  • 使用
    publicstaticsuperparent s=newsuperparent(0)而不是初始值的20
  • 注释掉第一次执行的readObject try catch块,并在第一次try catch块中添加修改代码c.s.data=20,然后写入文件,然后执行代码
  • 注释掉第二次执行的writeObject try catch块,然后执行read对象 再次编码。然后你可以看到20不能被序列化成文件,0被打印出来

  • 我认为您的测试代码无法验证这种情况。 因为20是由
    publicstaticsuperparent s=newsuperparent(20)设置的
    在类初始化中,JVM在类加载时总是将其设置为20

    如果希望初始数据为0,并检查无法序列化将数据修改为20,请重试

  • 使用
    publicstaticsuperparent s=newsuperparent(0)而不是初始值的20
  • 注释掉第一次执行的readObject try catch块,并在第一次try catch块中添加修改代码c.s.data=20,然后写入文件,然后执行代码
  • 注释掉第二次执行的writeObject try catch块,然后执行read对象 再次编码。然后你可以看到20不能被序列化成文件,0被打印出来

  • 这个问题是关于序列化静态“超级家长”成员,而不是“数据”成员。这个问题是关于序列化静态“超级家长”成员,而不是“数据”成员。祝贺您接受您的答案,这几乎是我自己的逐字副本!看起来你的答案更一般、更好,但我在发布我的答案时还没有读过你的答案。抱歉…没有人想抄袭别人的答案,这太愚蠢了…恭喜你接受了你的答案,这几乎是我自己的逐字逐句抄袭!看起来你的答案更一般、更好,但我在发布我的答案时还没有读过你的答案。很抱歉…没有人想抄袭别人的答案,这很愚蠢。。。