ObjectOutputStream
-
该类继承自 OutputStream
-
将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象。
-
只有支持java.io.Serializable接口的对象才能写入流中。 每个可序列化对象的类被编码,包括类的类名和签名,对象的字段和数组的值以及从初始对象引用的任何其他对象的关闭。
-
方法writeObject用于将一个对象写入流中。 任何对象,包括字符串和数组,都是用writeObject编写的。 多个对象或原语可以写入流。 必须从对应的ObjectInputstream读取对象,其类型和写入次序相同。
-
原始数据类型也可以使用DataOutput中的适当方法写入流中。 字符串也可以使用writeUTF方法写入。
员工实体类Staff
package com.hp.io;
import java.io.Serializable;
/**
* 员工类
* 实现序列化的接口
* @author 晓电脑
*/
public class Staff implements Serializable{
private static final long serialVersionUID = 2497140260621995246L;
//transient 表示name 不被序列化
private transient String name;
private int pay;
public Staff(){}
public Staff(String name, int pay) {
this.name = name;
this.pay = pay;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPay() {
return pay;
}
public void setPay(int pay) {
this.pay = pay;
}
@Override
public String toString() {
return "Staff{" +
"name='" + name + '\'' +
", pay=" + pay +
'}';
}
}
ObjectOutputStream 中的
-
writeObject 使用如下
public static void main (String[] args) {
try {
write("C:/Users/晓电脑/Desktop/a.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void write(String destPath) throws IOException {
Staff staff = new Staff("zs", 10000);
ObjectOutputStream outputStream = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(destPath)
)
)
);
//放入序列化对象
outputStream.writeObject(staff);
//释放资源
outputStream.flush();
outputStream.close();
}
运行结果如下(注意这并不是错误的)
接下来我们使用ObjectInputStream来读取序列化写入的内容
public static void main (String[] args) {
try {
read("C:/Users/晓电脑/Desktop/a.txt");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void write(String destPath) throws IOException {
Staff staff = new Staff("zs", 10000);
ObjectOutputStream outputStream = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(destPath)
)
)
);
//放入序列化对象
outputStream.writeObject(staff);
//释放资源
outputStream.flush();
outputStream.close();
}
得到员工的序列化工资
其中在读取序列化的过程中有这样几个问题
1),错误StreamCorruptedException: invalid type code: 00
2),Java serialVersionUID生成 我在使用序列化的过程中 第一次由于没有生成Java serialVersionUID 然后我用idea下载了一个插件自动生成Java serialVersionUID,然后重新写入,就不会报错了
总结:
1),不是所有的对象都可以序列化 java.io.Serializable
2),不是所有的属性都要序列化 可以使用 Transient 来不被序列化
扩展:
需求 :如果是多个对象输出到文件,然后读取 哪有该如何处理呢?
ObjectInputStream 与 ObjectOutputStream 没有提供操作多个对象的方法,但是我们可以使用对象数组来保存,如下
读取a.txt文件
结果为