java序列化和反序列化
Posted 不痴不立
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java序列化和反序列化相关的知识,希望对你有一定的参考价值。
序列化: 将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
transient的用法
在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息
(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以
加上transient关键字
使用transient的字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
核心代码:
1 private static final long serialVersionUID = 8294180014912103005L; 2 3 private String username; 4 private transient String passwd; 5 6 User user = new User(); 7 user.setUsername("Tom"); 8 user.setPasswd("123"); 9 10 11 ObjectOutputStream os = new ObjectOutputStream( 12 new FileOutputStream("C:/user.txt")); 13 os.writeObject(user); // 将User对象写进文件 14 os.flush(); 15 os.close(); 16 17 ObjectInputStream is = new ObjectInputStream(new FileInputStream( 18 "C:/user.txt")); 19 user = (User) is.readObject(); // 从流中读取User的数据 20 is.close();
注意:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类
需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变
实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前
JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的
1 private static final long serialVersionUID = 8294180014912103005L; 2 3 public static String username; 4 private transient String passwd; 5 6 User user = new User(); 7 user.setUsername("Tom"); 8 user.setPasswd("123"); 9 10 ObjectOutputStream os = new ObjectOutputStream( 11 new FileOutputStream("C:/user.txt")); 12 os.writeObject(user); // 将User对象写进文件 13 os.flush(); 14 os.close(); 15 16 // 在反序列化之前改变username的值 17 User.username = "jack"; 18 19 ObjectInputStream is = new ObjectInputStream(new FileInputStream( 20 "C:/user.txt")); 21 user = (User) is.readObject(); // 从流中读取User的数据 22 is.close();
以上是关于java序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章