Java中的序列化接口


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

在这篇文章中,我们将讨论 Java 中 Serializable 接口的使用,并提供示例。

Java 中的序列化和反序列化

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

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

Serializable 接口的语法

accesSpecifier class nameOfclass implements Serializable {
   // your code here
}  

访问修饰符 − 用于设置方法的可访问性。它可以是 public、protected、默认和 private。

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

要使用 Serializable 接口,需要导入以下包:

import java.io.*;

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

在深入了解 Serializable 接口的示例之前,有必要再讨论一些事情。

ObjectOutputStream

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

语法

writeObject(nameOfobject);

ObjectInputStream

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

语法

readObject();

示例 1

在下面的示例中,我们将了解 Serializable 接口的实现。

算法

  • 步骤 1 − 我们将从定义一个名为“Details”的类开始,该类实现了 Serializable 接口。在这个类中,声明两个实例变量“st”和“id”。这些信息稍后将被序列化和反序列化。

  • 步骤 2 − 在 main 方法中,定义一个 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) {  
      // constructor
      this.st = st;
      this.id = id;
   }
   // method for converting object into string
   public String toString() { 
      return "st = " + st + ", id = " + id;
   }
}
public class SerialDemo {
   public static void main(String args[]) {
      // code for serialization of object
      try {
         // creating object of ObjectOutputStream
         ObjectOutputStream strmOut =
         new ObjectOutputStream(new FileOutputStream("stream"));
         // passing data to object 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);
      }
      // code for deserialization of object
      try {
         // creating object of ObjectInputStream
         ObjectInputStream strmIn = new ObjectInputStream(new FileInputStream("stream"));
         // reading the details of object 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

结论

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

更新于: 2023年5月12日

1K+ 阅读量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.