【Transient】Transient 的作用和用法

发布时间 2023-03-22 21:11:13作者: 酷酷-

1  前言

 大家经常看源码会发现这个关键字,那么我们这节我们讲一下 transient 关键字,先看看它的的用法和作用:

  • 用法:只能用于修饰成员变量
  • 作用:Java 的 Serilizable 提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用序列化机制来保存它,这是可以通过 transient 来修饰,就不会持久化该属性了。

2  序列化

2.1  什么是序列化

简单来说:将数据结构或对象转换成二进制字节流的过程

2.2  为什么要序列化

  • 用于对象传输,比如我们的服务要把结果通过网络返回给用户,是不是需要先把结果序列化,然后才能传输,你不序列化是不是就是难为人家网络
  • 用于持久化,我们的对象是不是要落磁盘,就像我们的数据库持久化数据

2.3  怎么序列化

对于我们的 java 只需要实现 Serializable,至于人 java 内部怎么序列化的,咱们这里就不做讨论了.

3  示例

我们来写个例子尝试一下:

public class TestTransient {
    static class Person implements Serializable {
        private String name;
        private Integer age;
        private transient String password;

        public Person(String name, Integer age, String password) {
            this.name = name;
            this.age = age;
            this.password = password;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", password='" + password + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person("狗子", 1, "xxx");
        System.out.println("序列化前:" + person);
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("person.txt"));
        // 持久化对象-序列化
        os.writeObject(person);
        os.flush();
        os.close();

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("person.txt"));
        // 读取对象-反序列化
        person = (Person) is.readObject();
        is.close();
        System.out.println("序列化后:" + person);
    }
}

4  小结

  • transient 只能修饰变量,用于忽略序列化;
  • 一个静态变量不管是不是 transient 修饰,都不能被序列化(如果反序列化后类中static变量还有值,则值为当前JVM中对应static变量的值)