Serializable 接口位于 java.io
包中。它是一个标记接口(marker interface)。标记接口没有任何方法(method)和字段(field)。
当有些类(class)希望它们的实例(instance)被序列化(Serialized)或反序列化(Deserialized),则这些类需要继承(implement)该接口。序列化是一种将对象的状态转换为字节流的机制。序列化需要使用ObjectOutputStream
。反序列化则是在内存中使用字节流重新创建实际Java对象的反过程。这种机制可用于持久化对象。反序列化需要使用ObjectInputStream
。
因此,它可以有效地将对象的状态保存到文件中。
声明:
public interface Serializable
ObjectOutputStream
中的writeObject()
方法可以序列化对象。
声明:
public final void writeObject(Object obj)
throws IOException
ObjectInputStream
中readObject()
方法可以用来反序列化对象。
声明:
public final Object readObject()
throws IOException,
ClassNotFoundException
示例一:
// Java Program to demonstrate a class
// implementing Serializable interface
import java.io.Serializable;
public static class Student implements Serializable {
public String name = null;
public String dept = null;
public int id = 0;
}
可以看到Student类实现了Serializable接口,但是没有从Serializable接口实现任何方法。
示例二:
// Java program to illustrate Serializable interface
import java.io.*;
// By implementing Serializable interface
// we make sure that state of instances of class A
// can be saved in a file.
class A implements Serializable {
int i;
String s;
// A class constructor
public A(int i, String s)
{
this.i = i;
this.s = s;
}
}
public class Test {
public static void main(String[] args)
throws IOException, ClassNotFoundException
{
A a = new A(20, "Serializable");
// Serializing 'a'
FileOutputStream fos
= new FileOutputStream("xyz.txt");
ObjectOutputStream oos
= new ObjectOutputStream(fos);
oos.writeObject(a);
// De-serializing 'a'
FileInputStream fis
= new FileInputStream("xyz.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
A b = (A)ois.readObject(); // down-casting object
System.out.println(b.i + " " + b.s);
// closing streams
oos.close();
ois.close();
}
}
输出结果:
20 Serializable