• 技术文章 >Java >Java基础

    transient关键字的作用是什么

    青灯夜游青灯夜游2023-01-13 00:39:47原创7809

    transient关键字的作用是:被transient修饰的变量不参与序列化和反序列化。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

    本教程操作环境:windows7系统、java10版、Dell G3电脑。

    (学习视频分享:java教学视频

    Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。

    为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。

    当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

    简而言之,被transient修饰的变量不参与序列化和反序列化。

    接下来用代码来证明一下。

    新建一个Student类实现Serializable 接口,并重写其toString方法便于观察结果。

    一个age属性不被transient修饰,一个name属性被transient修饰。

    public class Student implements Serializable {
        private int age;
        private transient String name;
    
        public Student() {
        }
    
        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student{" + "age=" + age + ", name='" + name + '\'' + '}';
        }
    
    }

    然后在TransientTest类里边测试。

    PS:

    为了代码简洁这里的IO操作没有进行try catch操作而是直接抛出了。

    public class TestTransient {
    
        public static void main(String[] args) throws Exception {
            // 实例化一个Student对象.
            Student student = new Student(15, "HuaGe");
            System.out.println(student);
    
            // 将student对象写入磁盘文件(序列化)
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.txt"));
            oos.writeObject(student);
            oos.close();
    
            // 从磁盘文件读取student对象(反序列化)
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.txt"));
            student = (Student) ois.readObject();
            System.out.println(student);
        }
    }

    运行main方法,观察控制台打印信息。

    发现经过了序列化和反序列化后,name属性从HuaGe变为了null.

    这就说明了被transient修饰的变量不参与序列化和反序列化。

    那有没有例外呐?

    我们知道,java中有两种序列化的方式。

    1. 实现Serializable接口。

    2. 实现Externalizable接口。

    Externalizable接口是Serializable接口的子类

    源码如下

    public interface Externalizable extends java.io.Serializable {
     
        void writeExternal(ObjectOutput out) throws IOException;
    
       
        void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
    }

    这个接口的两个方法可以指定对类中的哪些属性进行序列化。

    使用这个接口时,无论属性有没有被transient修饰,

    默认不对任何属性进行序列化。所以实现了Externalizable接口的类

    一般不再使用transient修饰属性。

    总结:

    1. 被transient修饰的变量不参与序列化和反序列化

    2. transient一般在实现了Serializable接口的类中使用。

    更多编程相关知识,请访问:编程教学!!

    以上就是transient关键字的作用是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:java transient关键字
    上一篇:java如何获取系统当前时间 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 详解java中的transient关键字• 深入学习java之transient关键字• JavaScript介绍Service Worker 的生命周期及使用场景• java利用Jsoup库爬取天气• java面试之Arraylist和Linkedlist的区别
    1/1

    PHP中文网