Java 中的 Serializable 接口

javaobject oriented programmingprogramming

Serializable 接口提供了序列化对象的功能。它不定义任何方法和成员变量。当一个类实现 serializable 接口时,它只是表明这个类及其子类可以被序列化。serializable 接口用于实现对象的序列化和反序列化。

在本文中,我们将通过示例讨论 Java 中 Serializable 接口的使用。

Java 中的序列化和反序列化

序列化是一种将给定对象表示为字节序列的机制,而其反序列化则是将字节序列表示为对象。除了静态和瞬态变量之外,类的所有成员都可以在序列化过程中保留。这些操作有许多应用,其中之一就是远程方法调用,它允许从一台机器调用另一台机器的方法。

正如我们之前讨论过的,使用序列化功能的唯一方法是使用可序列化接口。因此,我们需要先实现它。

可序列化接口的语法

accesSpecifier class nameOfclass implements Serializable {
   // 此处为您的代码
}  

accesSpecifier − 用于设置方法的可访问性。它可以是 public、protected、default 和 private。

implements − 它是一个关键字,允许使用与其关联的类的接口功能。

要使用可序列化接口,必须导入以下包 −

import java.io.*;

这里,* 表示我们将此包中可用的所有类以及方法导入到我们的程序中。

在进入可序列化接口的示例之前,有必要讨论一些其他事情。

ObjectOutputStream

它是 OutputStream 类的子类,并实现 ObjectOutput 接口。它包含各种方法,writeObject 是其中之一,它将对象作为参数并将其转换为字节序列,这意味着它会序列化给定的对象。只有那些实现 Serializable 接口的类的对象才能作为参数传递。

语法

writeObject(nameOfobject);

ObjectInputStream

它是 InputStream 类的子类,并实现 ObjectInput 接口。它包含各种方法,readObject 是其中之一,它将字节流转换回对象,这意味着它执行反序列化。

语法

readObject();

示例 1

在下面的示例中,我们将了解可序列化接口的实现。

算法

  • 步骤 1 - 我们将首先定义一个名为"Details"的类,该类实现可序列化接口。在此类中,声明两个实例变量"st"和"id"。这些信息稍后将被序列化和反序列化。

  • 步骤 2 - 在主方法中,定义一个 try 块。在此块内,为 FileOutputStream 的文件流创建一个名为"strmOut"的 ObjectOutputStream 类对象。这里,FileOutputStream 指的是文件名"stream"。然后使用"writeObject"方法序列化"Details"类的"obj1"。

  • 步骤 3 - 在下一个 try 块中,我们将为 FileInputStream 的文件流创建一个名为"strmIn"的 ObjectInputStream 类对象。这里,FileInputStream 指的是文件名"stream"。然后使用"readObject"方法反序列化该对象并打印结果。

  • 步骤 4 - 相应 try 块的 catch 块将处理整个过程中是否发生任何类型的异常。

import java.io.*;
class Details implements Serializable {
   String st;
   int id;
   public Details(String st, int id) {  
      // 构造函数
      this.st = st;
      this.id = id;
   }
   // 将对象转换为字符串的方法
   public String toString() { 
      return "st = " + st + ", id = " + id;
   }
}
public class SerialDemo {
   public static void main(String args[]) {
      // 对象序列化的代码
      try {
         // 创建 ObjectOutputStream 对象
         ObjectOutputStream strmOut =
         new ObjectOutputStream(new FileOutputStream("stream"));
         // 将数据传递给对象 1
         Details obj1 = new Details("Tutorial 1", 121);
         System.out.println("Data of object 1 is passed to object2....");
         strmOut.writeObject(obj1);
      }
      catch(IOException exp) {
         System.out.println("Exception occurred during serialization of Object 1: " + exp);
      }
      // 对象反序列化的代码
      try {
         // 创建 ObjectInputStream 对象
         ObjectInputStream strmIn = new ObjectInputStream(new FileInputStream("stream"));
         // 读取对象 1 的详细信息
         Details obj2 = (Details)strmIn.readObject();
         System.out.println("Data of object 2: " + obj2);
      }
      catch(Exception exp) {
         System.out.println("Exception occurred during deserialization of Object 2: " + exp);
      }
   }
}

输出

Data of object 1 is passed to object2....
Data of object 2: st = Tutorial 1, id = 121

结论

可序列化接口的唯一用例是对象的序列化和反序列化。我们可以将文本、音频或任何自定义数据存储在序列化对象中。在本文中,我们列出了在此过程中对我们有帮助的所有方法。


相关文章