java高阶_Java高阶语法---transient

背景:听说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结果值和反序列化之前不一致。

4236b60675726db5fffa59623f0ed242.png

FYI:

1 importjava.io.ByteArrayInputStream;2 importjava.io.ByteArrayOutputStream;3 importjava.io.ObjectInputStream;4 importjava.io.ObjectOutputStream;5 importjava.io.Serializable;6 importlombok.Data;7 importlombok.extern.slf4j.Slf4j;8

9 @Slf4j10 public classTestTransient {11 public static void main(String[] args) throwsException {12 TestTransient.transientTest("tjt", "password666", 22);13 }14 public static void transientTest(String userName, String password,Integer age) throwsException {15 Account account = newAccount();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 = newByteArrayOutputStream();21 ObjectOutputStream objectOutputStream = newObjectOutputStream(byteArrayOutputStream);22 objectOutputStream.writeObject(account);23 byte[] bytes = byteArrayOutputStream.toByteArray(); //将account 转为流

24 account.age = 18; //在反序列化之前改变age值,结果:反序列化后的结果没有从序列化中取age值

25 ByteArrayInputStream byteArrayInputStream = newByteArrayInputStream(bytes);26 ObjectInputStream objectInputStream = null;27 objectInputStream = newObjectInputStream(byteArrayInputStream);28 Account accountAfter = (Account) objectInputStream.readObject(); //从流中获取account

29 log.info("after serializeble result is:"+accountAfter.getUserName()+"-"+accountAfter.getPassword()+"-"+accountAfter.getAge());30 }31 @Data32 static class Account implementsSerializable {33 private static final long serialVersionUID = -8994113761711738784L;34 privateString userName;35 private transientString password;36 private staticInteger age;37 public staticInteger getAge() {38 returnage;39 }40 public static voidsetAge(Integer age) {41 Account.age =age;42 }43 }44 }

执行结果:

- before serializeble result is:tjt-password666-22

- after serializeble result is:tjt-null-18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值