序列化static变量问题

public class User implements Serializable {

private static final long serialVersionUID = 4403512922350207270L;
private String name;
private int age;
private Date birthday;
static int count = 1 ;
private transient String gender;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public Date getBirthday() {
    return birthday;
}

public void setBirthday(Date birthday) {
    this.birthday = birthday;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}


@Override
public String toString() {
    return "User{" +
            "name=" + name + ", age=" + age +
            ", gender=" + gender +
            ", birthday=" + birthday + ",count=" +count +
            '}';
}

}

测试序列化
public class Test {
public static void main(String[] args) {

    User user = new User();
    user.setName("hollis");
    user.setGender("male");
    user.setAge(23);
    user.setBirthday(new Date());
    System.out.println(user);

    //Write Obj to File
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(new FileOutputStream("D:/tempFile.txt"));
        oos.writeObject(user);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(oos);
    }



}

}
输出内容为User{name=hollis, age=23, gender=male, birthday=Thu Jun 16 15:59:10 CST 2016,count=1}

测试反序列化
public class Test1 {
public static void main(String[] args) {
//Read Obj from File
File file = new File("D:/tempFile.txt");
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
User newUser = (User) ois.readObject();
System.out.println(newUser);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(ois);
try {
FileUtils.forceDelete(file);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
输出内容为User{name=hollis, age=23, gender=null, birthday=Thu Jun 16 15:59:10 CST 2016,count=1}

不是说static变量不能被序列化吗,为什么反序列化的时候还能把count读出来

2个回答

count确实没有序列化,但是你的类变量count初始化就是1,
你可以在序列化之前,改变count的值,然后反序列化回来,你会发现,count还是1.
这就证明了static类型变量是不会被序列化的。

如果有帮助,希望采纳

w172087242
little_how 回复wuqi1040715350: 如果有帮助,记得结帖哦,如果还有问题,可以一起探讨
3 年多之前 回复
wuqi1040715350
wuqi1040715350 回复little_how: 哦,确实是,基础不扎实了,谢谢了,关注你了,有问题还会问你的
3 年多之前 回复
w172087242
little_how 回复wuqi1040715350: 加载类是不执行构造方法的,只是load,测试类是否被加载,那么用静态代码块来输出才是正确的
3 年多之前 回复
wuqi1040715350
wuqi1040715350 回复little_how: 反序列化时候是没有加载类的,你可以试试,在User中写个构造方法里边打印写东西,如果类加载了,是一定会执行构造方法的
3 年多之前 回复
w172087242
little_how 回复wuqi1040715350: 反序列化回来的时候也要加载类啊,不加载类,会报class not found,实例是依托于类而存在的,如果类没被loader进来,那么实例如何能凭空出现
3 年多之前 回复
wuqi1040715350
wuqi1040715350 回复little_how: 我这个序列化和反序列化就是分别写了两个main方法执行的
3 年多之前 回复
wuqi1040715350
wuqi1040715350 既然第一次类加载时候的count已经没有了,那反序列化的时候count是从哪来的呢
3 年多之前 回复
w172087242
little_how 回复wuqi1040715350: 当然不能,两个main用的是两个虚拟机进程,可能用jvm不准确
3 年多之前 回复
wuqi1040715350
wuqi1040715350 回复little_how: 第一,类加载的时候,count是被初始化了,但是main方法执行完了之后,又执行了另一个main方法,count还能在内存中?
3 年多之前 回复
w172087242
little_how 回复wuqi1040715350: 而且类变量是共享在一个jvm中的,如果是在同一个jvm中改变类变量的值,那么所以对象都知道,如User.count=2;然后后面新new一个对象,这时候获取到的count也是2,跟对象无关
3 年多之前 回复
w172087242
little_how 回复wuqi1040715350: count是类变量,类在加载的时候就会初始化的变量,更对象无关,你不可能系列化一次,把类状态给改变吧。
3 年多之前 回复
wuqi1040715350
wuqi1040715350 你好,你说那种情况我试过,确实是那样,我就是不理解,序列化不就是把对象持久化到那个文件中吗,既然count没有被序列化,那反序列化的时候count是从哪来的呢
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!