乐趣区

关于后端:被遗忘的Java关键字transient

前言

  明天在看我的项目代码时候,看到了上面这样一行代码,用 transient 润饰了一个变量,次要作用是做一个全局开关。说实话我是第一次看到这个关键字。激发了我的好奇心,所以就理解一下这是何方神圣。

    /**
     * 全局开关
     */
    public static transient boolean running = true;

transient 是什么?

  在 Java 中,transient 是一个关键字,用于指定一个类的字段(成员变量)在序列化时应该被疏忽。在 Java 对象序列化期间,对象的状态被转换为字节流,以便在网络上传输或长久保留到磁盘。如果一个字段被标记为 transient,那么它的值不会被序列化,在反序列化时会被复原其默认值。

简略示例

public class Example implements Serializable {
    private String name;
    private transient int age;

    public Example(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {return "Example{name='" + name + "', age=" + age + "}";
    }

    public static void main(String[] args) throws Exception {
        String dir = "/Users/ryan/Desktop/";

        // 创立一个 Example 对象并序列化到文件
        Example obj = new Example("Ryan", 20);

        System.out.println("Before serialization:" + obj);
        OutputStream outputStream = Files.newOutputStream(Paths.get(dir + "example.ser"));
        try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) {out.writeObject(obj);
        }

        // 从文件中反序列化 Example 对象
        InputStream inputStream = Files.newInputStream(Paths.get(dir + "example.ser"));
        try (ObjectInputStream in = new ObjectInputStream(inputStream)) {System.out.println("After deserialization:" + in.readObject());
        }
    }
}

执行后果:

Before serialization: Example{name='Ryan', age=20}
After deserialization: Example{name='Ryan', age=0}

  在上述示例中,咱们创立了一个名为 Example 的类,并在其中定义了两个字段 nameage,其中 age 被标记为 transient。而后,咱们创立了一个 Example 对象并将其序列化到名为 example.ser 的文件中。

  接着,咱们从文件中反序列化了刚刚序列化的 Example 对象,并将其赋值给一个新的对象 newObj。而后,咱们打印出了原始对象和反序列化后的对象。能够看到,在反序列化后,age 字段的值被复原为其默认值 0。

应用场景

序列化敏感数据

  有些对象蕴含一些敏感信息,如明码、拜访令牌等,这些信息在对象序列化时须要被爱护,以防被未受权的用户拜访和泄露。

进步序列化性能

  有些对象中的字段可能会影响序列化和反序列化的性能,如蕴含大量数据的对象,这些数据可能会在网络传输或磁盘存储期间减少提早和负载,应用 transient 关键字能够排除这些字段,进步序列化性能。

长期数据

  有些字段仅用于对象的外部计算或长期存储数据,这些数据在序列化时无需保留,因而能够应用 transient 关键字来疏忽这些字段,从而缩小序列化后对象的大小。

须要留神的点

  • transient 关键字只能润饰变量,而不能润饰办法和类。
  • transient 标记的变量所在的类必须实现 Serializable 接口。
  • transient 标记的变量在反序列化时会被初始化为默认值,须要在程序中手动进行初始化操作。

总结

  transient 关键字只是临时地在序列化过程中疏忽了该字段,而不是永久性地从对象中删除该字段。在反序列化时,该字段将被复原为其默认值。因而,如果须要永恒地从对象中删除一个字段,间接将其从类中齐全删除。

应该很少有人,会在我的项目中应用这个关键字吧,所以它值得被忘记😂😂😂。

结尾

  如果感觉对你有帮忙,能够多多评论,多多点赞哦,也能够到我的主页看看,说不定有你喜爱的文章,也能够顺手点个关注哦,谢谢。

  我是不一样的科技宅,每天提高一点点,体验不一样的生存。咱们下期见!

退出移动版