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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值