本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。