我读到'序列化不适用于静态元素' - 但下面的一个简单示例告诉我。
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。 我错过了什么吗?
答案 0 :(得分:2)
这是因为您的int data=0;
不是您班级superparent
的静态成员。
另外我想指出,如果你忘记了这个推荐,那么班级名字应该以大写字母开头
答案 1 :(得分:2)
这里没什么特别的。您已为类statichost
声明了静态成员变量。当JVM加载类时,该变量被初始化,无论是什么触发了类的加载。
序列化和反序列化statichost
实例与静态字段无关,因为它们与您的类相关联,而不是与您的实例相关联。如果要对此进行测试,请将序列化和反序列化分解为不同的块并执行以下步骤:
statichost
实例superparent
,而不是20 statichost
实例如果静态字段已序列化,您可能希望c.s.getdata()
报告20,但会报告15。
答案 2 :(得分:0)
我认为您的测试代码无法验证这种情况。
因为20在类初始化中由public static superparent s=new superparent(20);
设置,所以在类加载时它总是由JVM设置为20.
如果您希望初始数据为0并检查数据修改为20无法序列化,请尝试
public static superparent s=new superparent(0);
代替20作为初始值。