关键字transient是干啥的

青旅半醒 2021-08-20 00:19 532阅读 0赞

百度百科的解释:

  1. Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

作用:
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

编码试验加以证明:

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

public static class TransientTest implements Serializable{
private static final long serialVersionUID = 233858934995755239L;
private String name1;
private transient String name2;

  1. public TransientTest(String name1,String name2)\{
  2. this.name1 = name1;
  3. this.name2 = name2;
  4. \}
  5. public String toString()\{
  6. return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);
  7. \}
  8. \}

2.写一个测试方法

public static void testTransient(){
String name1=”常规属性”,name2=”transient修饰的属性”;
TransientTest test = new TransientTest(name1, name2);
System.out.println(“序列化前:”+test.toString());
ObjectOutputStream outStream;
ObjectInputStream inStream;
String filePath = “D:/test/object/TransientTest.obj”;
try {
outStream = new ObjectOutputStream(new FileOutputStream(filePath));
outStream.writeObject(test);

  1. inStream = new ObjectInputStream(new FileInputStream(filePath));
  2. TransientTest readObject = (TransientTest)inStream.readObject();
  3. System.out.println("序列化后:"+readObject.toString());
  4. \} catch (IOException e) \{
  5. // TODO Auto-generated catch block
  6. e.printStackTrace();
  7. \} catch (ClassNotFoundException e) \{
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. \}
  11. \}

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

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

用二进制查看器打开这个文件也可以看到,数据中只有name1,没有name2。(请忽略乱码问题,这个不是重点哈。)

延伸:

在查看JDK源码的时候会发现很多地方都会加上transient关键字来修饰一些属性,那究竟是出于什么考虑才这么做呢?

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

以ArrayList中的 transient Object[] elementData 为例,这个成员变量的注释为:

翻译出来就是:

/ * *

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

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

*带有elementData的空ArrayList == DEFAULTCAPACITY_EMPTY_ELEMENTDATA

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

* /

  1. 这个缓冲区的容量实际上并不是ArrayList的容量,因为其实际上会预留一些空间,当空间不足时还会扩容,为减少浪费,因此在序列化时不会按照默认算法将这个成员变量写入磁盘。而是写了个writeObject方法,序列化时会调用这个方法将其持久化,在反序列化是,调用readObject,将其恢复出来。

这2个方法为:

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

public static class TransientTest implements Serializable{
private static final long serialVersionUID = 233858934995755239L;
private String name1;
private transient String name2;

  1. public TransientTest(String name1,String name2)\{
  2. this.name1 = name1;
  3. this.name2 = name2;
  4. \}
  5. public String toString()\{
  6. return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);
  7. \}
  8. private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException \{
  9. s.defaultWriteObject();
  10. s.writeObject(name2);
  11. \}
  12. private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException \{
  13. s.defaultReadObject();
  14. name2=String.valueOf(s.readObject());
  15. \}
  16. \}

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

20191011203323715.png

使用最多的场景应该就是对象转xml 对象转json(个人观点)
————————————————
版权声明:本文为CSDN博主「wolfshadow.cn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010188178/article/details/83581506

发表评论

表情:
评论列表 (有 0 条评论,532人围观)

还没有评论,来说两句吧...

相关阅读

    相关 关键字transient

    定义:Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量...

    相关 当程序员之前,你

    在“万物皆可跨界”的年代,跨界好像才是流行趋势:搜索引擎治疗疑难杂症,相声演员跨界唱歌,教育机构卖水果…… 要是只会做一件事情,简直都不好意思和别人打招呼。 在IT互联网界

    相关 Javatransient关键字

    transient这个关键字我们一般很少用到,但是我再阅读JDK源码的时候常常看到这个关键字,在这里总结一些这个关键字的用法。 1. 这个关键字主要是用于对象的序列化的。t

    相关 transient关键字

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

    相关 关键字 transient

    什么是序列化 Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络

    相关 关键字transient

    百度百科的解释:         Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transie