- ObjectOutputStream
- ObjectInputStream
- 序列化、反序列化
- 序列化 writeObject 将对象写入磁盘文件
- 反序列化 readObject 取出对象
- 自定义 Serializable 对象
- writeObject、readObject
- putFields、readFields
- 参考资料
- ObjectOutputStream:能将 javaBean对象(序列化)写入给定输出流
- 被写入的 javaBean 需要实现Serializable 接口。
- 对象输出流 的 writeObject() 方法会尝试调用 javaBean 中的 writeObject(ObjectOutputStream out) 方法。
- 在 javaBean 的 writeObject(ObjectOutputStream out) 中可用 out.putFields()获取对象属性并设置。
- ObjectInputStream:可以反序列化 ObjectInputStream 输出的对象。
- 对象输入流 的 readObject() 方法会尝试调用 javaBean 中的 readObject(ObjectInputStream in) 方法。
- 在 javaBean 的 readObject(ObjectInputStream in) 中可用 in.readFields()获取原对象属性并设置当前对象属性。
@Test
public void ObjectOutputStreamTest(){
HashMap map = new HashMap<>();
map.put("name","笨笨");
map.put("age",18);
map.put("equip", Arrays.asList("锅","碗","水瓢","盆"));
try(FileOutputStream fos = new FileOutputStream("e:\test.data");
ObjectOutputStream oos = new ObjectOutputStream(fos))
{
oos.writeObject(map);
} catch (IOException e) { e.printStackTrace(); }
}
- 文件内容
@Test
public void ObjectInputStreamTest() throws Exception {
try(FileInputStream fis = new FileInputStream("e:\test.data");
ObjectInputStream ois = new ObjectInputStream(fis)){
HashMap map = (HashMap)ois.readObject();
System.out.println(map);
} catch (IOException e) { e.printStackTrace(); }
}
输出:
{equip=[锅, 碗, 水瓢, 盆], name=笨笨, age=18}
自定义 Serializable 对象
writeObject、readObject
@Data
public class MyObject implements Serializable {
private String name = "笨笨";
private Integer age = 18;
}
public class ObjectInputOutputStreamTest implements Serializable {
@Test
public void OIOSTest() {
try (FileOutputStream fos = new FileOutputStream("e:\test.data");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(new MyObject()); // 序列化
} catch (IOException e) { e.printStackTrace(); }
try (FileInputStream fis = new FileInputStream("e:\test.data");
ObjectInputStream ois = new ObjectInputStream(fis)) {
System.out.println(ois.readObject()); // 反序列化
} catch (Exception e) { e.printStackTrace(); }
}
}
输出:
MyObject(name=笨笨, age=18)putFields、readFields
上面是简单的版本,接下来我们重写一下对象中的 writeObject、readObject。
借助putFields、readFields,读写的时候还可以做些额外的加工。
@Data
public class MyObject implements Serializable {
private String name = "笨笨";
private Integer age = 18;
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("name", String.class),
new ObjectStreamField("age", Integer.TYPE)
};
private void writeObject(ObjectOutputStream out) throws Exception {
ObjectOutputStream.PutField putField = out.putFields();
putField.put("name", "耀眼的笨笨");
putField.put("age", 999);
out.writeFields();
}
private void readObject(ObjectInputStream in) throws Exception {
ObjectInputStream.GetField getField = in.readFields();
name = "★" + (String) getField.get("name", "无名");
age = getField.get("age", 100) + 1;
}
}
输出:
MyObject(name=★耀眼的笨笨, age=1000)参考资料
Java 学习笔记 - IO篇:常见的【IO流Stream】以及相互关系



