Java Serializable接口
Serializable接口提供了将对象序列化的功能。它没有定义任何方法和成员变量。当一个类实现了Serializable接口时,它只是表示该类及其子类可以被序列化。Serializable接口用于实现对象的序列化和反序列化。
在本文中,我们将通过示例讨论Serializable接口在Java中的使用。
Java中的序列化和反序列化
序列化是一种机制,用于将给定的对象表示为一系列字节,而反序列化是将一系列字节表示为一个对象。除了静态和瞬态变量之外,类的所有成员在序列化过程中都可以被保留。这些操作有许多应用之一是远程方法调用,它允许从一台机器调用另一台机器的方法。
正如我们之前讨论的,使用序列化功能的唯一方法是使用Serializable接口。因此,我们需要先实现它。
Serializable接口的语法
accesSpecifier class nameOfclass implements Serializable {
// your code here
}
accesSpecifier − 用于设置方法的访问权限。它可以是public, protected, default 和 private。
implements − 这是一个关键字,它允许类与接口相关联并使用其功能。
要使用Serializable接口,重要的是要导入以下包 –
import java.io.*;
在这里,*表示我们将所有可用的类和方法导入我们的程序中。
在介绍可序列化接口的示例之前,有必要讨论一些其他内容。
ObjectOutputStream
它是OutputStream类的子类,并实现了ObjectOutput接口。它包含了多种方法,其中之一就是writeObject方法,它以一个对象作为参数,并将其转换为字节序列,即对给定的对象进行序列化。只有实现了Serializable接口的类的对象才能作为参数传递。
语法
writeObject(nameOfobject);
ObjectInputStream
它是InputStream类的一个子类,并实现了ObjectInput接口。它包含了各种方法,其中readObject是其中之一,它将字节流转换回对象,也就是进行反序列化操作。
语法
readObject();
示例1
在以下示例中,我们将理解可序列化接口的实现。
步骤
- 步骤1 - 我们首先定义一个名为‘Details’的类,该类实现Serializable接口。在这个类中,声明两个实例变量‘st’和‘id’。这些信息将在以后被序列化和反序列化。
-
步骤2 - 在main方法中,定义一个try块。在这个块内,创建一个ObjectOutputStream类的名为‘strmOut’的对象,用于FileOutputStream的文件流。这里,FileOutputStream指的是文件名‘stream’。然后使用‘writeObject’方法对‘Details’类的‘obj1’进行序列化。
-
步骤3 - 在下一个try块内,创建一个ObjectInputStream类的名为‘strmIn’的对象,用于FileInputStream的文件流。这里,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
结论
序列化接口的唯一用途是对象的序列化和反序列化。我们可以将文本、音频或任何自定义数据存储在序列化对象中。在本文中,我们列出了所有帮助我们进行这个过程的方法。