原文: https://javatutorial.net/java-serialization-example

序列化的对象。 这意味着什么? Java 提供了一种功能,该功能将对象表示为字节序列,其中包括对象的数据以及有关对象类型和该对象中存储的数据类型的信息。

Java 序列化示例 - 图1

将序列化的对象写入文件后,可以稍后对其进行反序列化,这反过来意味着–表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

Java 序列化示例 - 图2

创建的字节流与平台无关。 这意味着,如果对象在一个平台上序列化,则可以在另一个平台上反序列化。

ObjectInputStreamObjectOutputStrem是高级流,其中包含用于序列化和反序列化对象的方法。

ObjectInputStream提供了一个称为readObject()的方法,该方法可检索对象并将其反序列化。 它返回一个Object值,这意味着它将需要强制转换为适当的数据类型。 它抛出IOException

  1. public final Object readObject()

ObjectOutputStream提供了许多写入方法,但使用最广泛的是

  1. public final void writeObject(Object object)

writeObject()方法序列化对象并将其发送到输出流。 如果序列化出错,则可能会引发IOException

因此,为了可视化这些方法的确切位置,让我们在上面的图片中显示它们。

Java 序列化示例 - 图3

Java 序列化示例

DemoObject.java

  1. import java.io.*;
  2. public class DemoObject implements java.io.Serializable {
  3. private String name;
  4. private int age;
  5. public DemoObject (String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public String getName() {
  10. return this.name;
  11. }
  12. public int getAge() {
  13. return this.age;
  14. }
  15. }

Main.java

  1. import java.io.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. DemoObject objectExample = new DemoObject("John", 19);
  5. String filename = "file.ser";
  6. DemoObject obj = null;
  7. // serialization
  8. try {
  9. FileOutputStream file = new FileOutputStream(filename);
  10. ObjectOutputStream output = new ObjectOutputStream(file);
  11. output.writeObject(objectExample);
  12. output.close();
  13. file.close();
  14. System.out.println("Serialization of object has been completed");
  15. }
  16. catch(IOException err) {
  17. System.out.println("IOException occurred");
  18. }
  19. // Deserialization
  20. try {
  21. FileInputStream file = new FileInputStream(filename);
  22. ObjectInputStream input = new ObjectInputStream(file);
  23. obj = (DemoObject) input.readObject(); // cast to the appropriate type
  24. input.close();
  25. file.close();
  26. System.out.println("Deserialization of object has been completed");
  27. System.out.println();
  28. System.out.println("Values of deserialized object are:");
  29. System.out.println("==================================");
  30. System.out.println("Name = " + obj.getName());
  31. System.out.println("Age = " + obj.getAge());
  32. System.out.println("==================================");
  33. }
  34. catch(IOException err) {
  35. System.out.println("IOException is caught");
  36. }
  37. catch(ClassNotFoundException err) {
  38. System.out.println("ClassNotFoundException is caught");
  39. }
  40. }
  41. }

输出

  1. Serialization of object has been completed
  2. Deserialization of object has been completed
  3. Values of deserialized object are:
  4. ==================================
  5. Name = John
  6. Age = 19
  7. ==================================

以上的代码实现的细分

我们有一个DemoObject类,它是一个虚拟类,将对其进行序列化然后反序列化。 它有 2 个实例变量,我们称为名称和年龄。 我们可以将这些变量设置为公开,但是我们希望始终保持安全,因此在上面的示例中将它们声明为私有。

Main.java强制转换writeObjectreadObject并基本上将错误处理并打印到控制台。 在示例中,我们有一个设置为null的对象。 设置为null是因为它充当反序列化对象的“占位符”。 基本上,我们可以将反序列化的对象复制到该空对象中。

Java 序列化示例 - 图4

注意:如果您的编辑器显示此警告:

Java 序列化示例 - 图5

您可以忽略它或将您的 IDE 配置为自动生成 ID。 我总是建议让您的 IDE 为您创建唯一的标识符。

什么时候需要序列化

序列化是一种通用且有效的协议,可在组件之间传输对象。 序列化用于遵循此协议传输对象。

最后一点:请记住,使用一个 Java 版本进行序列化的对象可能无法在另一 Java 版本上运行。 例如:用 Java 6 序列化对象不是一个好主意,用 Java 8 反序列化它们,反之亦然。