Java Transient关键字
1. transient关键字的使用场景
在对象序列化过程中,类的某些属性不需要格式化时,会用transient关键字加以配合使用。例如,对于某些敏感的字段信息,为了安全起见,不希望进行网络传输(主要涉及到序列化操作,本地序列化缓存同样适用),对于这些字段可以使用transient关键字。也就是说,在对象序列化过程中,transient关键字修饰的字段的生命周期仅仅限于调用者内存期,不会写到磁盘里持久化或者进行网络传输。
代码示例>
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * *
* Title: 对Java中Transient关键字的验证操作 *
** Description: *
* * @author Bruce-Jiang * @Date 2016年7月25日下午8:12:18 * @Version */ public class Transitent { private static ObjectOutputStream oos = null; private static ObjectInputStream ois = null; // 获取项目路径下的某个目录 static { try { File file = new File(""); // 当前项目的绝对路径 String folderPath = file.getCanonicalPath(); oos = new ObjectOutputStream(new FileOutputStream(new File( folderPath, "/data/ser.txt"))); ois = new ObjectInputStream(new FileInputStream(new File( folderPath, "/data/ser.txt"))); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { /** * 运行结果 * Bruce * null */ Transitent.serializeOjbect(new User("Bruce","123456")); } /** * 执行序列化,反序列化的方法 * @param object */ public static void serializeOjbect(Object object) { try { // 序列化 oos.writeObject(object); // 反序列化 User user = (User) ois.readObject(); System.out.println(user.getUsername()); System.out.println(user.getPassword()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { oos = null; ois = null; } } } class User implements Serializable { /** * */ private static final long serialVersionUID = 5079515464322746070L; private String username; private transient String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } }
2. transient使用细节
以下所有的讨论都是在被序列化对象实现Serializable接口的基础上的
1>transient关键字是只能修饰字段,不能修饰类和方法,并且需要Serializable接口使用;
2>自定义变量被transient修饰后,在对象就行序列化操作时,将不包括该字段;
3>对于变量中的特例,被static关键字修饰的字段,无论是否被transient修饰,均不能被序列化。解释其中的原因:某个类在进行实例化对象的时候,在堆内存空间内为对象开辟存储空间,但是static关键字修饰的字段在类字节码加载时被初始化,其存在于方法区中,对象在进行序列化时,所有的数据均取自于堆中的实例对象。
在对象进行序列化操作时,我们通常有两种实现方式:
1.类定义时实现Serializable接口。实例化对象的序列化完全自动进行,transient关键字,对其中的字段序列化有限制作用。
2.类定义时继承Externalizable接口,此时需要在writeExternal方法中进行手工指定所要序列化的字段,字段是否序列化与是否被transient修饰无关。
3. 小结
以上所有内容来源于Java核心技术 II 以及互联网某些博主的博客,对此表示感谢!