当前位置: 移动技术网 > IT编程>开发语言>Java > Java高阶语法---transient

Java高阶语法---transient

2019年01月13日  | 移动技术网IT编程  | 我要评论

韩文字体下载,田明健,医道仕途21中文网

背景:听说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:
import java.io.bytearrayinputstream;
import java.io.bytearrayoutputstream;
import java.io.objectinputstream;
import java.io.objectoutputstream;
import java.io.serializable;
import lombok.data;
import lombok.extern.slf4j.slf4j;
@slf4j
public class testtransient {
    public static void main(string[] args) throws exception {
        testtransient.transienttest("tjt", "password666", 22);
    }
    public static void transienttest(string username, string password,integer age) throws exception {
        account account = new account();
        account.setusername(username);
        account.setpassword(password);
        account.setage(age);
        log.info("before serializeble result is:"+account.getusername()+"-"+account.getpassword()+"-"+account.getage());
        bytearrayoutputstream bytearrayoutputstream = new bytearrayoutputstream();
        objectoutputstream objectoutputstream = new objectoutputstream(bytearrayoutputstream);
        objectoutputstream.writeobject(account);
        byte[] bytes = bytearrayoutputstream.tobytearray(); // 将account 转为流
        account.age = 18;   // 在反序列化之前改变age值,结果:反序列化后的结果没有从序列化中取age值
        bytearrayinputstream bytearrayinputstream = new bytearrayinputstream(bytes);
        objectinputstream objectinputstream = null;
        objectinputstream = new objectinputstream(bytearrayinputstream);
        account accountafter = (account) objectinputstream.readobject();  // 从流中获取account
        log.info("after serializeble result is:"+accountafter.getusername()+"-"+accountafter.getpassword()+"-"+accountafter.getage());
    }
    @data
    static class  account implements serializable {
        private static final long serialversionuid = -8994113761711738784l;
        private string username;
        private transient string password;
        private static integer age;
        public static integer getage() {
            return age;
        }
        public static void setage(integer age) {
            account.age = age;
        }
    }
}
执行结果:

- before serializeble result is:tjt-password666-22
- after serializeble result is:tjt-null-18

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网