transient关键字浅析

264 阅读2分钟

发现

在实习过程中发现同事写了一个我从没见过的关键字 transient,于是我针对其做了一些研究。

transient是什么

transient是Java中的一个关键字,用于修饰类的成员变量。当一个变量被transient修饰时,它将不会被序列化,即在将对象写入文件或网络传输时,该变量的值不会被保存。

这是因为transient关键字告诉Java虚拟机,该变量不需要被序列化,因此在序列化过程中会被忽略。这通常用于那些不需要被序列化的敏感数据,例如密码、临时变量等。

需要注意的是,transient关键字只对对象的序列化有效,对于基本数据类型(如int、double等)和静态变量,transient关键字没有任何作用。

Transient和注解@JsonIgnore的区别

Transient和注解@JsonIgnore都与Java对象序列化有关,但它们的作用不同。

Transient关键字用于标记一个Java类的成员变量,表示该成员变量不需要被序列化,即在对象序列化时,该成员变量的值不会被保存到序列化流中。

而注解@JsonIgnore用于标记一个Java类的成员变量或getter方法,表示该成员变量或方法不需要被序列化或反序列化,即在对象序列化或反序列化时,该成员变量或方法的值不会被保存到序列化流中或从序列化流中读取。

所以,JsonIgnore的使用范围较Transient更广泛。

Transient使用的测试

 public static void main(String[] args) {
         Person lili = new Person("lili", 23);
         String o = JSON.toJSONString(lili);
         Person personObject = JSON.parseObject("{"age":23,"name":"lili"}", Person.class);
         System.out.println(o);
         System.out.println(personObject.toString());
 //{"name":"lili"}
 //Person{name='lili', age=23}
     }
 
 package org.example;
 ​
 import java.io.Serializable;
 ​
 public class Person implements Serializable {
     private static final long serialVersionUID = 1L;
     private String name;
     private transient int age; // 被标记为Transient的成员变量
 ​
     public Person(String name, int age) {
         this.name = name;
         this.age = age;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     @Override
     public String toString() {
         return "Person{" +
                 "name='" + name + ''' +
                 ", age=" + age +
                 '}';
     }
 ​
     public int getAge() {
         return age;
     }
 }