被遗忘的Java关键字transient的使用详解

 更新时间:2023年04月26日 10:04:27   作者:不一样的科技宅  
在 Java 中,transient 是一个关键字,用于指定一个类的字段(成员变量)在序列化时应该被忽略。本文将通过示例为大家简单讲讲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 的类,并在其中定义了两个字段 name 和 age,其中 age 被标记为 transient。然后,我们创建了一个 Example 对象并将其序列化到名为 example.ser 的文件中。

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

使用场景

序列化敏感数据

有些对象包含一些敏感信息,如密码、访问令牌等,这些信息在对象序列化时需要被保护,以防被未授权的用户访问和泄露。

提高序列化性能

有些对象中的字段可能会影响序列化和反序列化的性能,如包含大量数据的对象,这些数据可能会在网络传输或磁盘存储期间增加延迟和负载,使用 transient 关键字可以排除这些字段,提高序列化性能。

临时数据

有些字段仅用于对象的内部计算或临时存储数据,这些数据在序列化时无需保留,因此可以使用 transient 关键字来忽略这些字段,从而减少序列化后对象的大小。

需要注意的点

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

总结

transient 关键字只是暂时地在序列化过程中忽略了该字段,而不是永久性地从对象中删除该字段。在反序列化时,该字段将被恢复为其默认值。因此,如果需要永久地从对象中删除一个字段,直接将其从类中完全删除。

应该很少有人,会在项目中使用这个关键字吧,所以它值得被遗忘

到此这篇关于被遗忘的Java关键字transient的使用详解的文章就介绍到这了,更多相关Java关键字transient内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程 Guarded Suspension设计模式

    Java多线程 Guarded Suspension设计模式

    这篇文章主要介绍了Java多线程 Guarded Suspension设计模式,Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务,文章围绕Java多线程 Guarded Suspension展开内容,需要的朋友可以参考一下
    2021-10-10
  • 详解Java ReentrantLock可重入,可打断,锁超时的实现原理

    详解Java ReentrantLock可重入,可打断,锁超时的实现原理

    前面讲解了ReentrantLock加锁和解锁的原理实现,但是没有阐述它的可重入、可打断以及超时获取锁失败的原理,本文就重点讲解这三种情况,需要的可以了解一下
    2022-10-10
  • 实例讲解Java读取一般文本文件和word文档的方法

    实例讲解Java读取一般文本文件和word文档的方法

    读取一般文本文件很好办,调用Java自带的io包里的类即可,富文本的doc文件我们可以用Apache的poi项目中的WordExtractor,这里我们一起来以实例讲解Java读取一般文本文件和word文档的方法
    2016-06-06
  • Fastjson反序列化随机性失败示例详解

    Fastjson反序列化随机性失败示例详解

    这篇文章主要为大家介绍了Fastjson反序列化随机性失败示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 如何用Java注解和反射实现依赖注入

    如何用Java注解和反射实现依赖注入

    这篇文章主要介绍了如何用Java注解和反射实现依赖注入,对依赖注入感兴趣的同学,可以实验一下
    2021-05-05
  • Java中的collection集合类型总结

    Java中的collection集合类型总结

    Java的集合类型都是对java.util包中Collection接口的继承,这里我们主要介绍依赖于collection的一些主分支,一起来看一下Java中的collection集合类型总结
    2016-05-05
  • 在SpringBoot中配置Thymeleaf的模板路径方式

    在SpringBoot中配置Thymeleaf的模板路径方式

    这篇文章主要介绍了在SpringBoot中配置Thymeleaf的模板路径方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 解决idea使用过程中让你觉得不爽的一些问题(小结)

    解决idea使用过程中让你觉得不爽的一些问题(小结)

    这篇文章主要介绍了解决idea使用过程中让你觉得不爽的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java解析方法的调用关系示例详解

    Java解析方法的调用关系示例详解

    这篇文章主要介绍了Java解析方法的调用关系,方法在Java编程中用于封装重复的代码,提高代码复用性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java字符串 正则表达式详解

    Java字符串 正则表达式详解

    这篇文章主要介绍了java使用正则表达式查找包含的字符串功能,结合具体实例形式分析了java针对字符串匹配查找的相关实现技巧,需要的朋友可以参考下
    2021-09-09

最新评论