在 Java 中,序列化用于将对象转换为字节流。字节流由实例的数据以及存储在该实例中的数据类型组成。反序列化执行完全相反的操作。它将字节序列转换为原始对象数据。在序列化过程中,当我们不想序列化对象时,可以使用transient 关键字。
为什么要使用transient 关键字?
transient 关键字可以与类的数据成员一起使用,以避免它们的序列化。例如,如果程序接受用户的登录详细信息和密码。但是我们不想将原始密码存储在文件中。在这里,我们可以使用transient 关键字,当 JVM 读取transient 关键字时,它会忽略对象的原始值,而是存储对象的默认值。
句法:
private transient <member variable>;
或
transient private <member variable>;
何时使用transient 关键字?
- transient 修饰符可用于存在从同一类实例中的其他数据成员派生的数据成员的情况。
- 这个transient 关键字可以与不描述对象状态的数据成员一起使用。
- 非序列化对象或类的数据成员可以使用transient 修饰符。
Java transient 关键字示例
举个例子,我们声明了一个类为Student,它有三个数据成员id、name和age。如果你序列化对象,所有的值都将被序列化,但我们不想序列化一个值,例如age,那么我们可以将年龄数据成员声明为transient。
在这个例子中,我们创建了两个类Student和PersistExample。Student类的age数据成员被声明为transient,它的值不会被序列化。
如果您反序列化对象,您将获得transient变量的默认值。
让我们创建一个带有transient变量的类。
Student.java
import java.io.*;
public class Student implements Serializable {
int id;
String name;
transient int age;//Now it will not be serialized
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
PersistExample.java
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
class PersistExample {
public static void main(String args[]) throws Exception {
Student s1 = new Student(211, "ravi", 22);//creating object
//writing object into file
FileOutputStream f = new FileOutputStream("f.txt");
ObjectOutputStream out = new ObjectOutputStream(f);
out.writeObject(s1);
out.flush();
out.close();
f.close();
System.out.println("success");
}
}
输出:
success
现在编写反序列化代码。
DePersist.java
import java.io.*;
class DePersist {
public static void main(String args[]) throws Exception {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("f.txt"));
Student s = (Student) in.readObject();
System.out.println(s.id + " " + s.name + " " + s.age);
in.close();
}
}
输出:
211 ravi 0
如您所见,打印学生的年龄返回 0,因为年龄的值未序列化。
在本文中,我们讨论了Java中transient关键字的使用,在Java程序中使用transient关键字的位置以及transient关键字的实现。