zoukankan      html  css  js  c++  java
  • java:transient是什么,有什么作用

    参考博客:Java transient关键字 

    “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: 
       " + "user: " + uid + "
       logging date : " + loggingDate.toString()
    23                 + "
       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 above
    13     }
    14 }
    View Code

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

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

  • 相关阅读:
    应用运维职业现状
    两年工作总结
    explicit用法
    最小生成树 之 CODE[VS] 1231 最优布线问题
    最小生成树 之 CODE[VS] 1078 最小生成树
    并查集 之 CODE[VS] 1073 家族
    贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组
    枚举+并查集 之 CODE[VS] 1001 舒适的路线 2006年
    SPFA算法(求解单源最短路)详解 + 最短路 之 CODE[VS] 1079 回家
    最短路 之 CODE[VS] 1041 Car的旅行路线 2001年NOIP全国联赛提高组
  • 原文地址:https://www.cnblogs.com/chen-kh/p/6341607.html
Copyright © 2011-2022 走看看