java序列化和反序列化
2016-03-28 09:49
483 查看
序列化: 将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
transient的用法
在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息
(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以
加上transient关键字
使用transient的字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
核心代码:
注意:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类
需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变
实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前
JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
transient的用法
在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息
(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以
加上transient关键字
使用transient的字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
核心代码:
private static final long serialVersionUID = 8294180014912103005L; private String username; private transient String passwd; User user = new User(); user.setUsername("Tom"); user.setPasswd("123"); ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("C:/user.txt")); os.writeObject(user); // 将User对象写进文件 os.flush(); os.close(); ObjectInputStream is = new ObjectInputStream(new FileInputStream( "C:/user.txt")); user = (User) is.readObject(); // 从流中读取User的数据 is.close();
注意:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类
需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变
实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前
JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的
private static final long serialVersionUID = 8294180014912103005L; public static String username; private transient String passwd; User user = new User(); user.setUsername("Tom"); user.setPasswd("123"); ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("C:/user.txt")); os.writeObject(user); // 将User对象写进文件 os.flush(); os.close(); // 在反序列化之前改变username的值 User.username = "jack"; ObjectInputStream is = new ObjectInputStream(new FileInputStream( "C:/user.txt")); user = (User) is.readObject(); // 从流中读取User的数据 is.close();
相关文章推荐
- 阿里巴巴 内推 阿里云 Java研发一面过程
- java修饰符
- Java变量初始化顺序总结
- SpringSecurity工作原理小解读
- Spring MVC静态资源处理—— ||
- java对象的创建过程
- Struts2简介
- spring Mvc 执行原理 及 xml注解配置说明
- Java反射
- myeclipse中配置maven
- mybatis做like模糊查询
- Struts1和Struts2
- java.作业4 看电视2
- 排序算法--归并排序法
- Myeclipse导入项目异常
- [Java Performance] 数据库性能最佳实践 - JPA和读写优化
- 深入Java集合HashMap实现原理
- springboot-Developer tools开发者福利
- Java核心技术点之多线程
- 用面向对象的思维去解决数三退一。关键字,双向环形链表。