,,Java transient 关键字是干啥的

,,Java transient 关键字是干啥的

本文主要介绍Java transient关键字的作用。通过示例代码进行了非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。

百度百科的解释:

Java关键字,变量修饰符。如果用transient声明了一个实例变量,那么在存储对象时就不需要维护它的值。换句话说,标有transient关键字的成员变量不参与序列化过程。

作用:

Javaserialization提供了一种持久化对象实例的机制。持久化一个对象时,可能会有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在特定对象的域上关闭serialization,可以在该域之前添加关键字transient。当对象被序列化时,类型transient的变量值不包括在序列化表示中,而类型transient的变量包括在内。

编码试验加以证明:

1.自定义类(为了方便,我直接在main方法所在的类中添加了一个静态属性类,或者叫成员类)

公共静态类TransientTest实现Serializable{

private static final long serialVersionUID=233858934995755239 l;

私有字符串名称1;

私有瞬态字符串name2

public TransientTest(字符串名称1,字符串名称2){

this . name 1=name 1;

this . name 2=name 2;

}

公共字符串toString(){

返回string . format(' transient test . tostring():name1=% s,name2=%s ',name 1,name 2);

}

}

2.编写一个测试方法

公共静态void testTransient(){

String 1=“通用属性”,name2=“瞬态修饰属性”;

transient test test=new transient test(name 1,name 2);

System.out.println('序列化前:' test . tostring());

ObjectOutputStream outStream

ObjectInputStream inStream

string file path=' D:/test/object/transient test . obj ';

尝试{

out stream=new object output stream(新文件输出流(文件路径));

outStream.writeObject(测试);

inStream=new ObjectInputStream(new file inputstream(file path));

transient test read object=(transient test)in stream . read object();

System.out.println('序列化后:' read object . tostring());

} catch (IOException e) {

//TODO自动生成的catch块

e . printstacktrace();

} catch(ClassNotFoundException e){

//TODO自动生成的catch块

e . printstacktrace();

}

}

3.在main方法中执行,然后可以看到结果是

印证了上面“用transient关键字标记的成员变量不参与序列化过程”的说法。

用binary viewer打开这个文件,可以看到数据中只有name1,没有name2。请忽略乱码,这不是重点。)

延伸:

在看JDK源代码的时候,你会发现很多地方会添加transient个关键字来修改一些属性。这是什么原因呢?

我觉得,应该是为了节约磁盘空间,避免造成不必要的浪费吧。

以ArrayList中的瞬态对象[] elementData为例。该成员变量的注释是:

翻译过来就是:

/* *

*存储ArrayList元素的数组缓冲区。

* ArrayList的容量就是这个数组缓冲区的长度。任何的

* element data==default capacity _ empty _ element data的空ArrayList

*当添加第一个元素时,它将扩展为DEFAULT_CAPACITY。

* /

这个缓冲区的容量实际上并不是ArrayList的容量,因为它实际上会预留一些空间,空间不足的时候会进行扩展。为了减少浪费,在序列化过程中,不会根据默认算法将该成员变量写入磁盘。相反,我编写了一个writeObject方法,该方法将在序列化期间被调用来持久化它,并在反序列化期间被调用来恢复它。

这两种方法是:

参考ArrayList并在上面的TransientTest中添加2个方法,见代码:

公共静态类TransientTest实现Serializable{

private static final long serialVersionUID=233858934995755239 l;

私有字符串名称1;

私有瞬态字符串name2

public TransientTest(字符串名称1,字符串名称2){

this . name 1=name 1;

this . name 2=name 2;

}

公共字符串toString(){

返回字符串。格式('瞬态测试。tostring():名称1=% s,名称2=%s ',名称1,名称2);

}

私有void writeObject(Java。io。对象输出流抛出java.io.IOException {

s。defaultwriteobject();

s。writeobject(名称2);

}

私有void读取对象(Java。io。对象输入流抛出java.io.IOException,ClassNotFoundException {

s。默认读取对象();

名称2=字符串。(s . read object())的值;

}

}

然后在主要的方法中执行testTransient(),此时得到的结果是:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: