博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java:transient是什么,有什么作用
阅读量:6217 次
发布时间:2019-06-21

本文共 2340 字,大约阅读时间需要 7 分钟。

参考博客:

“Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。”

为了验证这个问题,我们写代码:设置一个普通属性,一个transient标记的属性,然后将对象串行化后再读出来,发现transient标记的属性并没有被串行化。

1 public class MyTransient implements java.io.Serializable { 2     /** 3      *  4      */ 5     private static final long serialVersionUID = -8771981914596808776L; 6     private Date loggingDate = new Date(); 7     private String uid; 8     private transient String pwd; 9 10     public MyTransient(String user, String password) {11         uid = user;12         pwd = password;13     }14 15     public String toString() {16         String password = null;17         if (pwd == null) {18             password = "NOT SET";19         } else {20             password = pwd;21         }22         return "logon info: \n   " + "user: " + uid + "\n   logging date : " + loggingDate.toString()23                 + "\n   password: " + password;24     }25 26     public static void main(String[] args) {27         MyTransient logInfo = new MyTransient("MIKE", "MECHANICS");28         System.out.println(logInfo.toString());29         try {30             ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("logInfo.out"));31             o.writeObject(logInfo);32             o.close();33             ObjectInputStream in = new ObjectInputStream(new FileInputStream("logInfo.out"));34             MyTransient logInfo1 = (MyTransient) in.readObject();35             System.out.println(logInfo1.toString());36         } catch (Exception e) {37         }38     }

文末作者提醒:粗心对待transient域可能引起的潜在问题。

1 public class GuestLoggingInfo implements java.io.Serializable { 2     private Date loggingDate = new Date(); 3     private String uid; 4     private transient String pwd; 5  6     GuestLoggingInfo() { 7         uid = "guest"; 8         pwd = "guest"; 9     }10 11     public String toString() {12         // same as above13     }14 }
View Code

现在,如果我们穿行化GuestLoggingInfo的一个实例,将它写入磁盘,并且再将它从磁盘中读出,我们仍然看到读回的对象打印password 为 "NOT SET"。当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是载入了一个该类对象的持久化状态,并将这个状态赋值给该类的另一个对象。

http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html

转载于:https://www.cnblogs.com/chen-kh/p/6341607.html

你可能感兴趣的文章
使用CSS渐变
查看>>
ASP.NET ViewState详解
查看>>
阿里 Maven仓库
查看>>
Python学习之==>正则表达式
查看>>
My97DatePicker时间控件使用方法
查看>>
c# 线程基础
查看>>
各类杀软对应的进程名
查看>>
推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
查看>>
iOS 7 & iOS 6适配问题
查看>>
《C++数据结构-快速拾遗》 手写链表
查看>>
hdu2068 RPG的错排 组合数/递推
查看>>
jar 文件不能运行
查看>>
小工具?不,这是小工具的集合!
查看>>
CAVLC算法解析
查看>>
12 在微服务集群中使用Zuul
查看>>
Python登陆人人网
查看>>
Exchange 2010 打补丁的顺序
查看>>
平方和与倒数和
查看>>
【乱码】乱码整理
查看>>
python基础之模块一
查看>>