序列化-JDK自带Serializable

 如下代码示例:实现了Serializable接口(强制)的类,可以通过ObjectOutputStream的writeObject()方法转为字节流。
字节流通过ObjectInputStream的readObject方法可以逆序列化为对象。

 1 @Data
 2 static class SimplePOJO implements Serializable{
 3     String field1;
 4     String field2;
 5     public SimplePOJO(String s1, String s2) {
 6         field1 = s1;
 7         field2 = s2;
 8     }
 9 }
10 
11 public static void main(String[] args) throws IOException, ClassNotFoundException {
12     //JDK自带序列化方法
13     FileOutputStream fos = new FileOutputStream("C:\\Users\\user\\Desktop\\student.dat");
14     SimplePOJO student = new SimplePOJO("16","张三");
15     ObjectOutputStream oos = new ObjectOutputStream(fos);
16     oos.writeObject(student);
17     oos.flush();
18     oos.close();
19     FileInputStream fis = new FileInputStream( "C:\\Users\\user\\Desktop\\student.dat");
20     ObjectInputStream ois = new ObjectInputStream(fis);
21     SimplePOJO deStudent = (SimplePOJO) ois.readObject();
22     ois.close();
23     System.out.println(deStudent);
24 }
  我们用文本编辑器打开保存的中间文件student.dat看看(因为是字节流,会有乱码:
  按照序列化协议的通用设计规则,会在首部包含数据的长度和首部长度。上图我们能明显看到类名和各个属性的类型和值,还能明显看到多个相同的间隔符。
 
  实际上该序列化协议的格式为:
  序列化过程就是在读取对象数据的时候,不断加入一些特殊分隔符,这些特殊分隔符用于在反序列化过程中截断用。
  头部数据用来声明序列化协议、序列化版本,用于高低版本向后兼容。
  对象数据主要包括类名、签名、属性名、属性类型及属性值,当然还有开头结尾等数据,除了属性值属于真正的对象值,其他都是为了反序列化用的元数据。
  存在对象引用、继承的情况下,就是递归遍历“写对象”逻辑。
posted @ 2021-05-08 08:40  凝冰物语  阅读(146)  评论(0编辑  收藏  举报