# Java 序列化概念和示例

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

在这里，我将学习和教你什么是 Java 的序列化以及如何编写相同的代码。

## 什么是序列化

Java 序列化是一个过程，其中对象的当前状态将保存在字节流中。 字节流是平台无关的，因此一旦在一个系统中创建了对象，便可以在其他平台上反序列化。

## 序列化有什么用

如上所述，序列化会将对象状态转换为字节流。 该字节流可用于其他目的。

*   写入磁盘
*   存储在内存中
*   通过网络将字节流发送到其他平台
*   将字节流保存在 DB 中（作为 BLOB）

## Java 中的序列化和反序列化

现在我们知道什么是序列化了。 但是我们需要了解如何用 Java 实现它以及它如何工作。

Java 已经提供了开箱即用的方式（`java.io.Serializable`接口）来序列化对象。 如果要序列化任何类，则该类需要实现给定的接口。

**注**：`Serializable`接口是标记接口。 因此，`Serializable`接口中没有任何方法。

## Java 类序列化代码

`Employee.java`

```java
package com.jbt;

import java.io.Serializable;

public class Employee implements Serializable
{
   public String firstName;
   public String lastName;
   private static final long serialVersionUID = 5462223600l;
} 
```

`SerializaitonClass.java`

```java
package com.jbt;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializaitonClass {

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.firstName = "Vivekanand";
		emp.lastName = "Gautam";

		try {
			FileOutputStream fileOut = new FileOutputStream("./employee.txt");
			ObjectOutputStream out = new ObjectOutputStream(fileOut);
			out.writeObject(emp);
			out.close();
			fileOut.close();
			System.out.printf("Serialized data is saved in ./employee.txt file");
		} catch (IOException i) {
			i.printStackTrace();
		}
	}
} 
```

`DeserializationClass.java`

```java
package com.jbt;

import java.io.*;

public class DeserializationClass {
	public static void main(String[] args) {
		Employee emp = null;
		try {
			FileInputStream fileIn = new FileInputStream("./employee.txt");
			ObjectInputStream in = new ObjectInputStream(fileIn);
			emp = (Employee) in.readObject();
			in.close();
			fileIn.close();
		} catch (IOException i) {
			i.printStackTrace();
			return;
		} catch (ClassNotFoundException c) {
			System.out.println("Employee class not found");
			c.printStackTrace();
			return;
		}
		System.out.println("Deserializing Employee...");
		System.out.println("First Name of Employee: " + emp.firstName);
		System.out.println("Last Name of Employee: " + emp.lastName);
	}
} 
```

首先，运行“`SerializaitonClass`”，您将创建“`employee.txt`”文件。

第二次运行“`DeserializationClass`”，Java 将反序列化该类，并在控制台中显示该值。

输出将是

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

### 项目要点

*   **序列化**接口需要使对象*序列化*。
*   瞬态[实例变量](https://javabeginnerstutorial.com/core-java-tutorial/instance-variable-java/)并未以对象状态序列化。
*   如果超类实现了`Serializable`，则子类也可以自动进行`Serializable`。
*   如果无法对超类进行序列化，则在对子类进行反序列化时，将调用超类的默认[构造器](https://javabeginnerstutorial.com/core-java-tutorial/constructors-in-java/)。 因此，所有变量将获得默认值，引用将为`null`。

在下一篇文章中，我们将讨论[瞬态变量](https://javabeginnerstutorial.com/core-java-tutorial/java-serialization-concept-example-part-ii/ "Java serialization concept and Example Part II")的使用。



*   **序列化**接口需要使对象*序列化*。
*   瞬态[实例变量](https://javabeginnerstutorial.com/core-java-tutorial/instance-variable-java/)并未以对象状态序列化。
*   如果超类实现了`Serializable`，则子类也可以自动进行`Serializable`。
*   如果无法对超类进行序列化，则在对子类进行反序列化时，将调用超类的默认[构造器](https://javabeginnerstutorial.com/core-java-tutorial/constructors-in-java/)。 因此，所有变量将获得默认值，引用将为`null`。