当Java中的对象被序列化时,它们的所有属性(包括私有属性)都将被保存。在某些情况下,某些属性可能不想被序列化。在这种情况下,使用Java中的transient
关键字进行标记,表示该属性不应该被序列化,并且不存储在返回的字节数组中。
在Java中,transient
是一个关键字,用于标记类成员变量,通常用于序列化和反序列化。
Markdown 格式
在Markdown中,transient
可以通过代码块(Code Blocks)
和强调字体(Emphasis)
来表现。
- 代码块:
Java中,
使用 transintransient
- 强调字体:
使用 transient
关键字
示例1
在以下示例中,Employee对象中定义了一个私有的surname
属性,但是使用了transient
关键字进行标记,在序列化时该属性将不会被传送。
class Employee implements Serializable {
private String name;
private transient String surname;
private int age;
public Employee(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
// 省略getter和setter方法
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", surname='" + surname + '\'' +
", age=" + age +
'}';
}
}
public class TransientExample1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Employee employee = new Employee("John", "Doe", 28);
System.out.println("Before Serialization: ");
System.out.println(employee);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("employee.ser")));
objectOutputStream.writeObject(employee);
objectOutputStream.close();
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("employee.ser")));
Employee employee1 = (Employee) objectInputStream.readObject();
objectInputStream.close();
System.out.println("After Deserialization: ");
System.out.println(employee1);
}
}
在此示例中,序列化前后,我们都可以看到surname
属性的值。但是,我们在序列化过程中使用了transient
关键字来标记该属性,它在序列化后并没有被保存,因此在反序列化后,该值为空。
示例2
在以下示例中,我们将使用一个普通的类变量,并且不使用transient
关键字进行标记,然后我们将进行Serialization并看看它的值。
class Demo implements Serializable {
int value = 3;
int tempValue = 5;
}
public class TransientExample2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Demo demo = new Demo();
System.out.println("Before Serialization: ");
System.out.println(demo.value);
System.out.println(demo.tempValue);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("demo.ser")));
objectOutputStream.writeObject(demo);
objectOutputStream.close();
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("demo.ser")));
Demo demo1 = (Demo) objectInputStream.readObject();
objectInputStream.close();
System.out.println("After Deserialization: ");
System.out.println(demo1.value);
System.out.println(demo1.tempValue);
}
}
此示例中,在序列化和反序列化过程中,我们都可以获得类中全部的属性值,因为我们没有标记任何属性为transient
。
希望这篇攻略能够解答您对transient
关键字的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java transient 关键字是干啥的 - Python技术站