java transient

原创 2011年01月13日 13:42:00

Java 的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。

transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。

首先,让我们看一些Java serialization的代码:
public class LoggingInfo implements java.io.Serializable
{
    private Date loggingDate = new Date();
    private String uid;
    private transient String pwd;
   
    LoggingInfo(String user, String password)
    {
        uid = user;
        pwd = password;
    }
    public String toString()
    {
        String password=null;
        if(pwd == null)
        {
        password = "NOT SET";
        }
        else
        {
            password = pwd;
        }
        return "logon info: /n   " + "user: " + uid +
            "/n   logging date : " + loggingDate.toString() +
            "/n   password: " + password;
    }
}

现在我们创建一个这个类的实例,并且串行化(serialize)它 ,然后将这个串行化对象写入磁盘。

LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
    ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("logInfo.out"));
    o.writeObject(logInfo);
    o.close();
}
catch(Exception e) {//deal with exception}

To read the object back, we can write

try
{
    ObjectInputStream in =new ObjectInputStream(new FileInputStream("logInfo.out"));
    LoggingInfo logInfo = (LoggingInfo)in.readObject();
    System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}

如果我们运行这段代码,我们会注意到从磁盘中读回(read——back (de-serializing))的对象打印password为"NOT SET"。这是当我们定义pwd域为transient时,所期望的正确结果。
现在,让我们来看一下粗心对待transient域可能引起的潜在问题。假设我们修改了类定义,提供给transient域一个默认值,
代码如下:

public class GuestLoggingInfo implements java.io.Serializable
{
    private Date loggingDate = new Date();
    private String uid;
    private transient String pwd;
   
    GuestLoggingInfo()
    {
        uid = "guest";
        pwd = "guest";
    }
    public String toString()
    {
        //same as above
     }
}
现在,如果我们串行化GuestLoggingInfo的一个实例,将它写入磁盘,并且再将它从磁盘中读出,我们仍然看到读回的对象打印password 为 "NOT SET"。当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是载入了一个该类对象的持久化状态,并将这个状态赋值给该类的另一个对象。

Java transient关键字的作用及使用方法

refs: http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法       ...
  • Henry_Wu001
  • Henry_Wu001
  • 2015年11月13日 11:38
  • 990

Java中的transient关键字

关键字介绍 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,可以不必关系具体序列化的过程,只要这个类实现了Serilizable接...
  • lfsf802
  • lfsf802
  • 2015年01月28日 21:18
  • 12923

JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)

transient(瞬时)关键字       当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复。如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通...
  • djun100
  • djun100
  • 2014年01月11日 17:49
  • 1402

关于hibernate中@Transient注解使用的一点心得

转(例): @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.  如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注...
  • u010786902
  • u010786902
  • 2016年03月16日 10:35
  • 12551

transient关键字

一、transient关键字的作用 1、为了数据安全,避免序列化和反序列化。 解释: 当对象被序列化时,被transient关键字修饰的变量不会被序列化到目标文件; 当对象从序列化文件重构对象时(反序...
  • wohyd
  • wohyd
  • 2017年02月08日 10:35
  • 410

@transient 注解注解,什么意思?

该注解,是Hibernate等框架的注解。  实体类中使用了@Table注解后,想要添加表中不存在字段,就要使用@Transient这个注解了。在网上找的方法是要将这个注解添加到自定义字段的get方...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年11月25日 09:52
  • 20414

谈谈Serializable、transient、volatile、final在多线程编程中的应用

一个实现Serializable的类的对象才可以序列化,实现序列号的对象可以以数据流的形式传输。Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明...
  • sg_0504
  • sg_0504
  • 2014年02月05日 21:52
  • 2275

Java 序列化、反序列化与transient关键字

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。      将序列化对象写入文件之后,可以从...
  • chy555chy
  • chy555chy
  • 2016年09月09日 17:07
  • 574

transient的作用及使用方法

转:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Seriliza...
  • godspeedlaile9
  • godspeedlaile9
  • 2016年04月18日 11:05
  • 335

static、final、transient等关键字的作用

staticstatic表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块 被static修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行才会释...
  • zhangfengzhang123
  • zhangfengzhang123
  • 2017年02月28日 17:11
  • 663
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java transient
举报原因:
原因补充:

(最多只允许输入30个字)