首页 > 其他 > 详细

序列化-JDK自带Serializable

时间:2021-05-08 10:00:33      阅读:16      评论:0      收藏:0      [点我收藏+]
 如下代码示例:实现了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看看(因为是字节流,会有乱码:
技术分享图片
  按照序列化协议的通用设计规则,会在首部包含数据的长度和首部长度。上图我们能明显看到类名和各个属性的类型和值,还能明显看到多个相同的间隔符。
 
  实际上该序列化协议的格式为:
技术分享图片
  序列化过程就是在读取对象数据的时候,不断加入一些特殊分隔符,这些特殊分隔符用于在反序列化过程中截断用。
  头部数据用来声明序列化协议、序列化版本,用于高低版本向后兼容。
  对象数据主要包括类名、签名、属性名、属性类型及属性值,当然还有开头结尾等数据,除了属性值属于真正的对象值,其他都是为了反序列化用的元数据。
  存在对象引用、继承的情况下,就是递归遍历“写对象”逻辑。

序列化-JDK自带Serializable

原文:https://www.cnblogs.com/ningbing/p/14743475.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!