`
jubincn
  • 浏览: 242317 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

java关键字Transient 转自:http://blog.csdn.net/flynetcn/archive/2008/03/03/2142020.aspx

 
阅读更多

转自:http://blog.csdn.net/flynetcn/archive/2008/03/03/2142020.aspx

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"。当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是载入了一个该类对象的持久化状态,并将这个状态赋值给该类的另一个对象。

分享到:
评论

相关推荐

    spring_MVC源码

    03.import java.io.Serializable; 04. 05.import javax.persistence.Basic; 06.import javax.persistence.Column; 07.import javax.persistence.Entity; 08.import javax.persistence.GeneratedValue; 09....

    Java关键字Transient与串行化

    ### Java关键字Transient与串行化 #### Transient关键字解析 在Java编程语言中,`transient`是一个非常重要的关键字,主要用于对象的串行化过程中。它用于标记对象中的某些字段,使得这些字段不会被串行化到持久...

    46个java关键字介绍和使用大全含示例(值得珍藏)

    Java关键字是编程的基础,它们是Java语言中预定义的特殊标识符,有着特定的含义和功能。本篇文章将深入探讨46个Java关键字,并通过示例来解释它们的使用。 1. `abstract` 关键字用于声明抽象方法或抽象类。抽象方法...

    java 中序列化NotSerializableException问题解决办法

    Java 中序列化 NotSerializableException 问题解决办法 Java 中序列化 NotSerializableException 问题是 Java 开发中常见的问题之一。 NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不...

    国产器件代理商清单大全2022

    11. **防护元件**:TVS(Transient Voltage Suppressor)、ESD(Electrostatic Discharge)二极管等由深圳瑞隆源电子、深圳天成照明等公司提供,用于保护电路免受过电压和静电冲击。 12. **电容、电感**:包括陶瓷...

    java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...

    2015中兴笔试B卷

    #### 三、Java关键字列表 以下是Java中的一些关键字: - **implements**: 表示类实现接口。 - **extends**: 表示类继承另一个类。 - **abstract**: 用于声明抽象类或抽象方法。 - **assert**: 断言,用于程序调试...

    [微软企业库] Microsoft Enterprise Library 6

    This release includes: Data Access Block, Exception Handling Block, Logging Block, Policy Injection Block, Semantic Logging Block, Transient Fault Handling Block, Validation Block, and Unity;...

    EDEM-API之基础资料.rar

    EDEM-API之基础资料(内含stp模型及源码等文件): 1、Plug-in_Contact_Model.zip; 2、Variable_Cohesion.zip; 3、Relative_Wear.zip;...8、Field_Data_Coupling_Transient.zip; 9、Remove_Particles.zip;

    java关键字和java命名规范.pdf

    Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...

    java关键字总结文档

    ### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...

    JAVA关键字

    Java关键字是编程的基础,它们是Java语言预定义的、具有特殊含义的标识符,不能作为变量名、方法名或类名。以下是对50个Java关键字的详细解释: 1. **abstract**:用于声明抽象类或抽象方法,不包含具体实现。 2. ...

    Manning.Dependency.Injection.in.NET.2012

    依赖注入(Dependency Injection,简称DI)是软件设计模式中的一种,尤其在.NET开发环境中,它在构建可维护、可测试的复杂应用系统中扮演着重要角色。标题"Manning.Dependency.Injection.in.NET.2012"揭示了这本书的...

    EFCore配置好的框架

    Entity Framework Core (简称EF Core) 是Microsoft开发的一个开源对象关系映射(ORM)框架,它是Entity Framework的轻量级、跨平台版本,适用于.NET Core和.NET Framework应用程序。这个"EFCore配置好的框架"提供了...

    lombok的jar包.zip

    Lombok是一款非常实用的Java库,它通过提供一系列的注解来简化代码,尤其是在处理getter、setter、equals、hashCode、toString等常规样板代码时。这个压缩包“lombok.jar”包含了Lombok的所有功能,用于Eclipse这样...

    Java_transient关键字

    ### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列化过程中对特定变量的控制。当一个类实现了`Serializable`接口时,其对象可以被序列化为一个持久化的...

    Java之transient关键字.Java

    除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中的概念,例如Tomcat...

    NI Circuit Design Suite Getting Started Guide 中文版.pdf

    同时,Multisim 还提供了多种仿真方式,包括 DC 仿真、AC 仿真和 transient 仿真等。 布线设计是 Multisim 的另一个重要功能,用户可以使用 Multisim 进行布线设计,并将其转换为 PCB 布局。Multisim 还提供了自动...

    Java中的transient关键字.doc

    Java 中的 transient 关键字 在 Java 编程中,transient 关键字是一个非常重要的概念,它用来说明一个属性是临时的,不会被序列化。在 Java 中,序列化是指将对象的状态信息转换为字节流的过程,以便于对象在网络上...

Global site tag (gtag.js) - Google Analytics