54.md 4.5 KB
Newer Older
W
wizardforcel 已提交
1
# Java 序列化概念和示例
W
init  
wizardforcel 已提交
2 3 4

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

W
wizardforcel 已提交
5
在这里,我将学习和教你什么是 Java 的序列化以及如何编写相同的代码。
W
init  
wizardforcel 已提交
6 7 8

## 什么是序列化

W
wizardforcel 已提交
9
Java 序列化是一个过程,其中对象的当前状态将保存在字节流中。 字节流是平台无关的,因此一旦在一个系统中创建了对象,便可以在其他平台上反序列化。
W
init  
wizardforcel 已提交
10 11 12 13 14 15 16 17

## 序列化有什么用

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

*   写入磁盘
*   存储在内存中
*   通过网络将字节流发送到其他平台
W
wizardforcel 已提交
18
*   将字节流保存在 DB 中(作为 BLOB)
W
init  
wizardforcel 已提交
19

W
wizardforcel 已提交
20
## Java 中的序列化和反序列化
W
init  
wizardforcel 已提交
21

W
wizardforcel 已提交
22
现在我们知道什么是序列化了。 但是我们需要了解如何用 Java 实现它以及它如何工作。
W
init  
wizardforcel 已提交
23

W
wizardforcel 已提交
24
Java 已经提供了开箱即用的方式(`java.io.Serializable`接口)来序列化对象。 如果要序列化任何类,则该类需要实现给定的接口。
W
init  
wizardforcel 已提交
25

W
wizardforcel 已提交
26
**注**`Serializable`接口是标记接口。 因此,`Serializable`接口中没有任何方法。
W
init  
wizardforcel 已提交
27

W
wizardforcel 已提交
28
## Java 类序列化代码
W
init  
wizardforcel 已提交
29

W
wizardforcel 已提交
30
`Employee.java`
W
init  
wizardforcel 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44

```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;
} 
```

W
wizardforcel 已提交
45
`SerializaitonClass.java`
W
init  
wizardforcel 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

```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();
		}
	}
} 
```

W
wizardforcel 已提交
75
`DeserializationClass.java`
W
init  
wizardforcel 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

```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);
	}
} 
```

W
wizardforcel 已提交
106
首先,运行“`SerializaitonClass`”,您将创建“`employee.txt`”文件。
W
init  
wizardforcel 已提交
107

W
wizardforcel 已提交
108
第二次运行“`DeserializationClass`”,Java 将反序列化该类,并在控制台中显示该值。
W
init  
wizardforcel 已提交
109 110 111 112 113 114 115 116 117

输出将是

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

W
wizardforcel 已提交
118
### 项目要点
W
init  
wizardforcel 已提交
119

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

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



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