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
类。
package com.jbt;
import java.io.Serializable;
public class Employee implements Serializable
{
public String firstName;
/*
* Here transient modifier is used for lastName variable.
* This variable's state will not be saved while serialzation.
* While De-Serialization process default value will be provide.
* null in this case.
*/
transient public String lastName;
private static final long serialVersionUID = 5462223600l;
}
如果您执行相同的类(SerializaitonClass
&DeserializationClass
),则输出将与之前的代码不同。
Deserializing Employee...
First Name of Employee: Vivekanand
Last Name of Employee: null
如您所见,姓氏为null
,因为在序列化过程中未保存该变量的状态。
类层次结构和可序列化
在这里,我将讨论Serializable
接口对类层次结构的影响。 如果一个类实现了Serializable
接口,则可以保存该类的状态。 但是,如果同一类扩展了另一个未实现Serializable
接口的类,则不会保存超类的状态。
为了了解区别,我们将更新原始的Employee
类。 现在,该类将扩展另一个类superEmployee
。 该超类将不会实现Serializable
接口。
package com.jbt;
import java.io.Serializable;
public class Employee extends superEmployee implements Serializable {
public String firstName;
private static final long serialVersionUID = 5462223600l;
}
class superEmployee {
public String lastName;
}
如果您一个接一个地执行“SerializaitonClass
”和“DeserializationClass
”,那么输出将如下所示
Deserializing Employee...
First Name of Employee: Vivekanand
Last Name of Employee: null
瞬态与静态变量
我已经写了一篇完整的文章。 请在此处访问。