使用ObjectOutputStream进行对象数据序列化的基本步骤
- 创建对象输出流:首先需要创建一个
ObjectOutputStream
对象,它需要一个字节输出流作为参数。例如,可以通过FileOutputStream
来创建一个写入文件的字节输出流,进而创建ObjectOutputStream
。示例代码如下:
try {
FileOutputStream fileOut = new FileOutputStream("example.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
- 序列化对象:调用
ObjectOutputStream
的writeObject()
方法来序列化对象。例如,如果有一个自定义类MyClass
的对象myObject
,可以这样写:
MyClass myObject = new MyClass();
try {
out.writeObject(myObject);
} catch (IOException e) {
e.printStackTrace();
}
- 关闭流:在完成对象序列化后,需要关闭
ObjectOutputStream
和相关的字节输出流,以释放资源。示例代码如下:
try {
out.close();
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
需要序列化的类要满足的条件
- 实现Serializable接口:该类必须实现
java.io.Serializable
接口,这个接口是一个标记接口,没有任何方法。它只是告诉Java虚拟机这个类可以被序列化。示例代码如下:
public class MyClass implements Serializable {
// 类的成员变量和方法
}
- 成员变量的序列化:
- 如果类的成员变量也是对象类型,这些对象类型的成员变量也必须是可序列化的,即也要实现
Serializable
接口。例如,如果MyClass
中有一个MyInnerClass
类型的成员变量,MyInnerClass
也需要实现Serializable
接口。
- 对于不想被序列化的成员变量,可以使用
transient
关键字修饰。这样在序列化对象时,该成员变量的值不会被序列化到流中。例如:
public class MyClass implements Serializable {
private transient int nonSerializableField;
// 其他成员变量和方法
}