码迷,mamicode.com
首页 > 编程语言 > 详细

java序列化和反序列化

时间:2016-03-28 10:17:19      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

序列化: 将数据结构或对象转换成二进制串的过程。

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

 

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序列化和反序列化

标签:

原文地址:http://www.cnblogs.com/wangwanchao/p/5327903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!