java transient
来源:互联网 发布:c语言的就业前景 编辑:程序博客网 时间:2024/05/16 10:03
道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
transient的定义
1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。
2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
3、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。
示例代码:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @description 使用transient关键字不序列化某个变量
* 注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致
*
* @author Alexia
* @date 2013-10-15
*/
public class TransientTest {
public static void main(String[] args) { User user = new User(); user.setUsername("Alexia"); user.setPasswd("123456"); System.out.println("read before Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); try { ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("C:/user.txt")); os.writeObject(user); // 将User对象写进文件 os.flush(); os.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream( "C:/user.txt")); user = (User) is.readObject(); // 从流中读取User的数据 is.close(); System.out.println("\nread after Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }}
}
class User implements Serializable {
private static final long serialVersionUID = 8294180014912103005L;
private String username;private transient String passwd;public String getUsername() { return username;}public void setUsername(String username) { this.username = username;}public String getPasswd() { return passwd;}public void setPasswd(String passwd) { this.passwd = passwd;}
}
输出结果:
read before Serializable:
username: Alexia
password: 123456
read after Serializable:
username: Alexia
password: null
跟多内容请参考http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
- java transient
- Java transient
- java transient
- java transient
- transient java
- java transient
- Java transient
- java transient
- java transient
- Java transient
- java transient
- java transient
- Java--transient
- Java transient
- java关键字Transient
- java关键字Transient
- java关键字Transient
- java关键字Transient
- linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)
- linux里安装redis以及redis的安全设置
- 多出口IP指定
- 遇到Windows2003无法连接远程桌面问题怎么办? 按照以下步骤来一一排除问题吧!
- iosiOS开发多线程GCD
- java transient
- jQuery如何根据元素值删除数组元素
- 用PyInstaller将python转成可执行文件exe笔记
- Android屏幕分辨率,颜色、像素的使用(技巧)(必看)
- Redis三种启动方式
- 【录教程必备】推荐几款屏幕录制工具(可录制GIF)
- 记录有点意思的网站
- 242. Valid Anagram
- C++ std::vector元素的内存分配问题(补充)