Java高阶语法---transient
2019-01-15 07:02:25来源:博客园 阅读 ()
背景:听说transient Java高阶语法是挺进BAT必经之路。
transient:
Java中transient 关键字的作用,简单的说就是让某些被修饰的成员属性变量不被序列化。
这又扯到了序列化和反序列化:
Java中对象的序列化是指将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可以用网络传输;就比如我们使用缓存cache/redis或远程调用RPC(网络传输)如一些密码等不想让人看到的敏感信息的时候,都要让缓存或传输的实体类实现Serializable接口,就是为了序列化实体类。 反序列化:序列化后的终极目的还是反序列化,恢复原先的Java对象,So序列化后的总结序列都是可以恢复为java对象的,此恢复过程就称为反序列化。
具体来说:
1、transient修饰的变量将不再是对象持久化的一部分,此变量内容在序列化后无法获得;
2、transient关键字只能修饰变量,本地变量除外,而不能修饰方法和类;
3、transient修饰的变量不能再被序列化,除此之外静态变量有无transient修饰都不能被序列化;
如下情况可以考虑使用transient关键字修饰:
1、类中的某个字段可以根据其他的字段推导出来,如一个盈利类有三个属性(出售单价、进价、利润),那么在序列化的时候,利润这个属性就没必要序列化了;
2、除此之外,具体看项目的业务需求,哪些字段不想被序列化则用transient 修饰即可;
另外:不序列化还有一个好处,那就是节省内存空间。
写个例子验证下:一个实体类读写流的操作,password用transient修饰,age用static修饰,userName常规操作,序列化实体类执行发现,password无法序列化,age结果值和反序列化之前不一致。
FYI:
1 import java.io.ByteArrayInputStream;
2 import java.io.ByteArrayOutputStream;
3 import java.io.ObjectInputStream;
4 import java.io.ObjectOutputStream;
5 import java.io.Serializable;
6 import lombok.Data;
7 import lombok.extern.slf4j.Slf4j;
8
9 @Slf4j
10 public class TestTransient {
11 public static void main(String[] args) throws Exception {
12 TestTransient.transientTest("tjt", "password666", 22);
13 }
14 public static void transientTest(String userName, String password,Integer age) throws Exception {
15 Account account = new Account();
16 account.setUserName(userName);
17 account.setPassword(password);
18 account.setAge(age);
19 log.info("before serializeble result is:"+account.getUserName()+"-"+account.getPassword()+"-"+account.getAge());
20 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
21 ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
22 objectOutputStream.writeObject(account);
23 byte[] bytes = byteArrayOutputStream.toByteArray(); // 将account 转为流
24 account.age = 18; // 在反序列化之前改变age值,结果:反序列化后的结果没有从序列化中取age值
25 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
26 ObjectInputStream objectInputStream = null;
27 objectInputStream = new ObjectInputStream(byteArrayInputStream);
28 Account accountAfter = (Account) objectInputStream.readObject(); // 从流中获取account
29 log.info("after serializeble result is:"+accountAfter.getUserName()+"-"+accountAfter.getPassword()+"-"+accountAfter.getAge());
30 }
31 @Data
32 static class Account implements Serializable {
33 private static final long serialVersionUID = -8994113761711738784L;
34 private String userName;
35 private transient String password;
36 private static Integer age;
37 public static Integer getAge() {
38 return age;
39 }
40 public static void setAge(Integer age) {
41 Account.age = age;
42 }
43 }
44 }
执行结果:
- before serializeble result is:tjt-password666-22
- after serializeble result is:tjt-null-18
原文链接:https://www.cnblogs.com/taojietaoge/p/10260145.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:2 ZooKeep安装
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash