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变量的值)