关于transient和static的序列化和反序列化
Posted 濒临小浣熊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于transient和static的序列化和反序列化相关的知识,希望对你有一定的参考价值。
做java开发有段时间了,最近没那么忙了,抽了点时间看了下java的源码 。
在读源码的时候看到了一个 transient 修饰的变量 ,字面意思是瞬变的。在以前的开发过程中也没用到过这个修饰语,查了一下这个修饰语的作用为使被 transient 修饰的变量在序列化的时候不会被
保存到文件中,也就是通过序列化后再被反序列化后读取这个变量不会有值,下面是演示实例:
实体类:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private transient String password; //被transient修饰的变量
private static String age;
}
测试类:
public class Test {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
User user = new User();
user.setAge("22");
user.setName("小明");
user.setPassword("admin");
System.out.println(user.getAge()+"\\t"+user.getName()+"\\t"+user.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
oos.writeObject(user);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
User users = (User) ois.readObject();
System.out.println(users.getAge()+"\\t"+users.getName()+"\\t"+users.getPassword());
}
}
从运行结果可以看出用 transient 修饰的变量在反序列化后值为 null
被static修饰的变量应该也是不会被序列化的,因为只有堆内存会被序列化.所以静态变量会天生不会被序列化。
那这里被static修饰的变量反序列化后有值又是什么鬼 这是因为 静态变量在方法区,本来流里面就没有写入静态变量,我们打印静态变量当然会去方法区查找,我们当前 jvm 中有所以静态变量在序列化后任然有值。
接着进行对 static 修饰的变量的验证:
public class Test {
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException {
User user = new User();
user.setAge("22");
user.setName("小明");
user.setPassword("admin");
System.out.println(user.getAge()+"\\t"+user.getName()+"\\t"+user.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/user.txt"));
user.setAge("33"); //在序列化后在对static修饰的变量进行一次赋值操作
oos.writeObject(user);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/user.txt"));
User users = (User) ois.readObject();
System.out.println(users.getAge()+"\\t"+users.getName()+"\\t"+users.getPassword());
}
}
运行结果如下:
可以看到在序列化前 static 修饰的变量赋值为22,而反序列化后读取的这个变量值为33,由此可以看出 static 修饰的变量本身是不会被序列化的
我们读取的值是当前jvm中的方法区对应此变量的值,所以最后输出的值为我们对static 变量后赋的值
以上代码只是测试代码,有逻辑上的问题还望大家见谅。
以上是关于关于transient和static的序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章