Java Transient关键字

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 以及互联网某些博主的博客,对此表示感谢!

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页