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

> 原文： [https://javabeginnerstutorial.com/core-java-tutorial/java-serialization-concept-example-part-ii/](https://javabeginnerstutorial.com/core-java-tutorial/java-serialization-concept-example-part-ii/)

[在第一部分](https://javabeginnerstutorial.com/core-java-tutorial/java-serialization-concept-example/ "Java serialization concept and Example")中，我们讨论了什么是序列化以及如何在 Java 中实现。 在本文中，我们将讨论一些涉及序列化的高级主题。

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

## 使用`serialVersionUID`

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

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

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

## 瞬态的使用

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

使用瞬态变量更改`Employee`类。

```java
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`），则输出将与之前的代码不同。

```java
Deserializing Employee...
First Name of Employee: Vivekanand
Last Name of Employee: null 
```

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

## 类层次结构和可序列化

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

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

```java
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`”，那么输出将如下所示

```java
Deserializing Employee...
First Name of Employee: Vivekanand
Last Name of Employee: null 
```

## 瞬态与静态变量

我已经写了一篇完整的文章。 [请在此处访问](https://javabeginnerstutorial.com/core-java-tutorial/transient-vs-static-variable-java/ "Transient vs Static variable java")。
