java基础——transient

今天在看struts1源代码的时候,发如今ActionForm中首先声明了两个transient类型的protected变量。

之前没有接触过该transient类型,所以就查了查。

transient是java语言的keyword,变量修饰符。假设用它声明一个实例变量。当对象存储时,它的值不须要维持。

在java中一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化。java的这样的序列化模式为开发人员提供了非常多便利,我们能够不必关系详细序列化的过程,仅仅要这个类实现了Serilizable接口。这个的全部属性和方法都会自己主动序列化。

然而在实际开发过程中,我们经常会遇到这种问题,这个类的有些属性须要序列化,而其它属性不须要被序列化。诚然,你能够让这个类来实现Externalizable接口,这个接口是Serilizable的子接口,可是你必须实现readExternal和writeExternal方法。你能够在这两个方法中实现详细属性的反序列化和序列化操作。然而这就意味着你必须在这两个方法中手工编写额外的代码来进行详细属性的序列化。

这时transient就派上用场了,你仅仅须要实现Serilizable接口,将不须要序列化的属性前加入keywordtransient,序列化对象的时候。这个属性就不会序列化到指定的目的地中。

而在struts源代码中。ActionForm也确实是implement了Serilizable接口。

以下是个小样例。从执行结果上就能够看明确了

public class TestTransient {

public static void main(String[] args) throws FileNotFoundException, IOException, 

ClassNotFoundException {
   A a = new A(25,"姓名");
   System.out.println(a);
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c://transient.txt"));
   oos.writeObject(a);
   oos.close();
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c://transient.txt"));
   a = (A)ois.readObject();
   System.out.println(a);

 }

}

class A implements Serializable{
	int a;
	transient String b;
	public A(int a,String b){
   		this.a = a;
   		this.b = b;
	}
	public String toString(){
   		return "a = "+a+",b = "+b;
	}
}

执行结果例如以下:

a = 25,b = 姓名

a = 25,b = null

在上面的样例中,我将属性b前加入keywordtransient,我们看到尽管我们序列化的对象a的属性值为“张三”,可是当我们反序列化之后发现这个属性为空。说明这个属性没有进行序列化。

时间: 2024-10-11 01:44:08

java基础——transient的相关文章

第3篇-JAVA基础

第3篇-JAVA基础 每篇一句 :目标是给梦想一个期限,行动与坚持就是实现梦想的过程 初学心得: 遇到困难或问题,它不是休止符,而是引向你如何解决问题的标识 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-26| JAVA基础 Ⅱ] 上篇回顾 上篇文章中我们学习了JAVA底层的运行机制与深入剖析以及解释其中JAVA基础代码的含义 本篇文章将JAVA基础Ⅱ全面剖析解释,因为JAVA基础非常重要,务必要牢记知识点!!! 1.JAVA基础语法格式 JAVA采用unicode编码 1

Java基础语法

Java的基础语法中包含字符集.标识符和关键字.变量和常量.语句.注释.运算符和表达式这些基本要素. 一.关键字 编程语言都有一些保留的单词,用于定义该语言,这些单词对于编译器有特殊含义,不能作为标识符使用: Java中的true.false.null这三个保留字,不能作为标识符使用,对于编译器有特殊含义: main是一个用于描述Java程序开始方法的特殊名称,它不是一个关键字: abstract 抽象 boolean 逻辑运算: 布尔 break 打破: 断开 byte 字节: case 例,

java基础篇---I/O技术(三)

接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream).使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化 一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息. 对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的

【Java基础】序列化与反序列化深入分析

一.前言 复习Java基础知识点的序列化与反序列化过程,整理了如下学习笔记. 二.为什么需要序列化与反序列化 程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级.装备等等),之后玩家再此登入时,必须要恢复这些状态信息.我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我

JAVA基础英语单词表(下)

quantity                     / 'kw?ntiti /                    量,数量 query                            / 'kwi?ri /                       查询 queue                           / kju: /                                队列 rate                          / reit /

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho

Java基础常见英语词汇

(转自http://www.jianshu.com/p/2743fe834166) Java基础常见英语词汇(共70个) ['?bd?ekt] ['?:rientid]导向的 ['pr??ɡr?m??]编程OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 [d?'vel?pm?nt][k?t]工具箱 ['v??tj??l]虚拟的JDK:Java development kit, java开发工具包 JVM:java

java基础7:I/O包中的其他类

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概