“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”?
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。
定义People
密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。
为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!
执行操作:
密码字段为null,反序列化时根本没有从文件中获取到信息。
适用场景:
1.不打算序列化某字段的值,节省空间
2.传递序列化流的时候,不传递该值等
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。
定义People
- publicclassPeopleimplementsSerializable{
- privatestaticfinallongserialVersionUID=8294180014912103005L;
- /**
- *用户名
- */
- privateStringusername;
- /**
- *密码
- */
- privatetransientStringpassword;
- }
密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。
为了代码简洁,未将流操作至于try-catch中,仅为演示,勿仿!
- publicstaticvoidmain(String[]args)throwsException{
- Peoplep=newPeople();
- p.setUsername("snowolf");
- p.setPassword("123456");
- System.err.println("------操作前------");
- System.err.println("username:"+p.getUsername());
- System.err.println("password:"+p.getPassword());
- ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(
- "people.txt"));
- oos.writeObject(p);
- oos.flush();
- oos.close();
- ObjectInputStreamois=newObjectInputStream(newFileInputStream(
- "people.txt"));
- p=(People)ois.readObject();
- ois.close();
- System.err.println("------操作后------");
- System.err.println("username:"+p.getUsername());
- System.err.println("password:"+p.getPassword());
- }
执行操作:
引用
------操作前------
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
密码字段为null,反序列化时根本没有从文件中获取到信息。
适用场景:
1.不打算序列化某字段的值,节省空间
2.传递序列化流的时候,不传递该值等