`

transient用法

阅读更多

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的使用

    说明 本文的路径被我删了部分,所以复制代码的话要注意自己写好文件的path。 控制序列化IO的类 import java.io.*; public class PersonMapper { private PersonMapper() {} private static PersonMapper mapper;...

    java中transient关键字用法分析

    主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    Java transient关键字使用小记

    transient的作用及使用方法  我们都知道一个对象只要实现了Serilizable接口,这个对象可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了...

    Java transient 关键字详解及实例代码

    本文章向大家介绍Java transient关键字的使用方法和实例,包括的知识点有transient的作用、transient使用小结、transient使用细节,需要的朋友可以参考一下

    【objectarx.net】暂态图形的使用(DrawVectors和Transient)

    本工程在objectarx2020下测试通过,如要在其他版本的sdk下使用,需要修改工程的引用文件 编译方法: 1、将解压后的文件夹放到objectarx2020 文件夹 内samples\dotNet 目录下,如G:\mywork\my-object-arx\samples\...

    matlab精度检验代码-Spatial-temporal-Adaptive-Transient-Stability-Assessment-f

    这些代码用于我们的论文“缺少数据的电力系统的时空自适应暂态稳定性评估”,下面的介绍为它们提供了用法。 由于Github的容量有限,我们很抱歉无法上传数据集,但读者可以根据本文中的数据生成方法来生成它们。 好好...

    GPS定位代码matlab-rsi_transient:使用RSI计算GPS时间序列内的瞬态概率

    rsi_transient 这是一个MATLAB软件包,可使用相对强度指数(RSI)搜索GPS时间序列中的瞬态检测。 该方法的概述在以下位置提供: Crowell,BW,Y.Bock和Z.Liu(2016),单站自动检测具有相对强度指数的GPS时间序列中...

    clojure-transient-test:证明 CLJ-1285 的测试

    一个展示使用传统单元测试找到有多困难的项目。 要将基于属性的测试与传统的单元测试进行比较,请参阅和。 用法 git clone git@github.com:reiddraper/clojure-transient-test.git cd clojure-transient-test lein ...

    lombok-1.16.16源码和文档

      默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。 @ToString   生成toString方法,默认情况下,会输出类名、所有属性,属性会...

    matlab光谱降维代码-transient_decomp_ssa:提取大脑氧合信号中瞬时成分的方法[Matlab代码]

    该方法以迭代方式使用奇异频谱分析。 设计用于使用近红外光谱(NIRS)设备测量的早产儿的脑氧合信号,但可能适用于其他领域。 请参阅下面的更多细节: O'Toole JM. Dempsey EM, Boylan GB (2018) 'Extracting ...

    使用TKPROF 工具分析跟踪文件

    系统的执行效率比较低,一个比较好的方法是通过跟踪用户的会话并且使用Tkprof 工具使用排序功能格式 化输出,从而找出有问题的SQL 语句。 TKPROF 工具是oracle 提供的免费工具,有人习惯称之为"Trace Kernel Profile...

    热传递matlab代码-MATLAB-CFD-code-for-transient-1D-heat-conduction-using-expl

    这使用瞬态有限体积方法的显式方案进行时间离散化来求解方程。 编写此代码时不使用功能,因此将更多重点放在CFD程序的过程问题解决上。 该代码仅用于教育目的,不够准确,无法解决实际问题。 该代码可作为CFD课程...

    差分攻击MATLAB代码-multiband-transient-shaper:吠声频率滤波器组+SPL差分包络跟随器瞬态整形器

    该方法是在24个Bark频带上应用SPL差分包络,大致执行以下步骤: 将输入信号带入Bark标度(20-20,000 Hz)的24个频带中 对于每个频带,计算带通信号的功率导数 根据功率的导数计算快速和缓慢的攻击释放包络。 nb! ...

    深入探索Java对象的序列化

    深入探索Java对象的序列化 对象序列化就是把对象写入到输出流中,用来存储或者传输。...实现了序列化接口的类,如果其成员不需要序列化进去,则使用transient关键字进行修饰。 下面给出个例子:

    Java面向对象程序设计(“方法”相关文档)共57张.pptx

    例如: public class Date1 声明Date1类,访问权限为public,表示类Date1可以被该类所属的包之外的类使用。 Java面向对象程序设计("方法"相关文档)共57张全文共57页,当前为第6页。 类主体的结构: <类首声明> { //...

    java8stream源码-java8-cert:一些用于练习Java8OCP的代码

    instanceof确切行为(在接口上使用null和用法) 包和导入(静态导入,重要的java.*包) 更多关键词: synchronized 、 transient 、 native 回顾:java.lang.Object 和可覆盖的方法 回顾:继承和接口 Java 8:具有...

    AutoParcel:这个小库允许轻松创建可分割的类

    它避免编写(无聊的)CREATOR 和读/写方法来将常规类变成可分块的类。 基本用法 拉取 AutoParcel 项目,然后将 AutoParcelLib 作为 Android 项目导入。 包括 AutoParcelLib 作为您的项目库。 只需使用...

    PSPICE简明教程

    2. 带OrCAD Capture的Pspice用法 2.1 第一步:在Capture 中创建电路 2.2 第二步:指定分析和仿真类型 偏置或直流分析(BIAS or DC analysis) 直流扫描仿真(DC Sweep simulation) 2.3 第三步:显示仿真结果 2.4 ...

Global site tag (gtag.js) - Google Analytics