Java 序列化概念和示例第二部分

原文: https://javabeginnerstutorial.com/core-java-tutorial/java-serialization-concept-example-part-ii/

在第一部分中,我们讨论了什么是序列化以及如何在 Java 中实现。 在本文中,我们将讨论一些涉及序列化的高级主题。

在本文中,我们将使用与上一篇文章相同的代码库。

使用serialVersionUID

您必须已经看到在源代码中使用了一个名为“serialVersionUID”的变量。 使用此变量有特定的原因。

serialVersionUID是通过序列化运行时与每个可序列化类关联的版本号。 在反序列化过程中使用此版本号来验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。

  • 在可序列化类中定义serialVersionUID字段不是强制性
  • 如果可序列化的类具有显式的serialVersionUID,则此字段的类型应为long,并且必须是静态且最终的。
  • 如果没有明确定义的serialVersionUID字段,则序列化运行时将计算该类的默认值。 随编译器的实现而有所不同。 因此建议定义serialVersionUID
  • 建议对serialVersionUID使用私有访问修饰符。
  • 数组类无法声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,无需匹配serialVersionUID值。
  • 如果已加载的接收器类的serialVersionUID与相应的发送器类之间存在差异,则将引发 InvalidClassException

瞬态的使用

我们可以使用Serializable保存对象的状态。 但是,如果我不想保存字段状态怎么办? 在这种情况下,可以像下面这样使用瞬态修饰符。 序列化过程中不会保存瞬态字段状态,反序列化时会将默认值分配给同一变量。

使用瞬态变量更改Employee类。

  1. package com.jbt;
  2. import java.io.Serializable;
  3. public class Employee implements Serializable
  4. {
  5. public String firstName;
  6. /*
  7. * Here transient modifier is used for lastName variable.
  8. * This variable's state will not be saved while serialzation.
  9. * While De-Serialization process default value will be provide.
  10. * null in this case.
  11. */
  12. transient public String lastName;
  13. private static final long serialVersionUID = 5462223600l;
  14. }

如果您执行相同的类(SerializaitonClass&DeserializationClass),则输出将与之前的代码不同。

  1. Deserializing Employee...
  2. First Name of Employee: Vivekanand
  3. Last Name of Employee: null

如您所见,姓氏为null,因为在序列化过程中未保存该变量的状态。

类层次结构和可序列化

在这里,我将讨论Serializable接口对类层次结构的影响。 如果一个类实现了Serializable接口,则可以保存该类的状态。 但是,如果同一类扩展了另一个未实现Serializable接口的类,则不会保存超类的状态。

为了了解区别,我们将更新原始的Employee类。 现在,该类将扩展另一个类superEmployee。 该超类将不会实现Serializable接口。

  1. package com.jbt;
  2. import java.io.Serializable;
  3. public class Employee extends superEmployee implements Serializable {
  4. public String firstName;
  5. private static final long serialVersionUID = 5462223600l;
  6. }
  7. class superEmployee {
  8. public String lastName;
  9. }

如果您一个接一个地执行“SerializaitonClass”和“DeserializationClass”,那么输出将如下所示

  1. Deserializing Employee...
  2. First Name of Employee: Vivekanand
  3. Last Name of Employee: null

瞬态与静态变量

我已经写了一篇完整的文章。 请在此处访问