Java 序列化概念和示例

原文: 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

  1. package com.jbt;
  2. import java.io.Serializable;
  3. public class Employee implements Serializable
  4. {
  5. public String firstName;
  6. public String lastName;
  7. private static final long serialVersionUID = 5462223600l;
  8. }

SerializaitonClass.java

  1. package com.jbt;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectOutputStream;
  5. public class SerializaitonClass {
  6. public static void main(String[] args) {
  7. Employee emp = new Employee();
  8. emp.firstName = "Vivekanand";
  9. emp.lastName = "Gautam";
  10. try {
  11. FileOutputStream fileOut = new FileOutputStream("./employee.txt");
  12. ObjectOutputStream out = new ObjectOutputStream(fileOut);
  13. out.writeObject(emp);
  14. out.close();
  15. fileOut.close();
  16. System.out.printf("Serialized data is saved in ./employee.txt file");
  17. } catch (IOException i) {
  18. i.printStackTrace();
  19. }
  20. }
  21. }

DeserializationClass.java

  1. package com.jbt;
  2. import java.io.*;
  3. public class DeserializationClass {
  4. public static void main(String[] args) {
  5. Employee emp = null;
  6. try {
  7. FileInputStream fileIn = new FileInputStream("./employee.txt");
  8. ObjectInputStream in = new ObjectInputStream(fileIn);
  9. emp = (Employee) in.readObject();
  10. in.close();
  11. fileIn.close();
  12. } catch (IOException i) {
  13. i.printStackTrace();
  14. return;
  15. } catch (ClassNotFoundException c) {
  16. System.out.println("Employee class not found");
  17. c.printStackTrace();
  18. return;
  19. }
  20. System.out.println("Deserializing Employee...");
  21. System.out.println("First Name of Employee: " + emp.firstName);
  22. System.out.println("Last Name of Employee: " + emp.lastName);
  23. }
  24. }

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

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

输出将是

  1. Deserializing Employee...
  2. First Name of Employee: Vivekanand
  3. Last Name of Employee: Gautam

项目要点

  • 序列化接口需要使对象序列化
  • 瞬态实例变量并未以对象状态序列化。
  • 如果超类实现了Serializable,则子类也可以自动进行Serializable
  • 如果无法对超类进行序列化,则在对子类进行反序列化时,将调用超类的默认构造器。 因此,所有变量将获得默认值,引用将为null

在下一篇文章中,我们将讨论瞬态变量的使用。

  • 序列化接口需要使对象序列化
  • 瞬态实例变量并未以对象状态序列化。
  • 如果超类实现了Serializable,则子类也可以自动进行Serializable
  • 如果无法对超类进行序列化,则在对子类进行反序列化时,将调用超类的默认构造器。 因此,所有变量将获得默认值,引用将为null