序列化-JDK自带Serializable
2024-09-06 22:02:14
如下代码示例:实现了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看看(因为是字节流,会有乱码:
按照序列化协议的通用设计规则,会在首部包含数据的长度和首部长度。上图我们能明显看到类名和各个属性的类型和值,还能明显看到多个相同的间隔符。
实际上该序列化协议的格式为:
序列化过程就是在读取对象数据的时候,不断加入一些特殊分隔符,这些特殊分隔符用于在反序列化过程中截断用。
头部数据用来声明序列化协议、序列化版本,用于高低版本向后兼容。
对象数据主要包括类名、签名、属性名、属性类型及属性值,当然还有开头结尾等数据,除了属性值属于真正的对象值,其他都是为了反序列化用的元数据。
存在对象引用、继承的情况下,就是递归遍历“写对象”逻辑。
最新文章
- 【JavaEE企业应用实战学习记录】requestListener
- std::stringstream
- 做网站用UTF-8还是GB2312 &; 各国语言对应字符集
- 查看PostgreSQL版本,编译器版本号
- Entity Framework 5问题集锦
- 【SVN】删除文件/文件夹 svn: E205007: Could not use external editor to fetch log message
- 待解决)leetcode 路径和 dfs 线序遍历
- join函数——Gevent源码分析
- 软件设计师.NET认证考试测试卷(试题及答案)
- C++矩阵处理库--Eigen初步使用
- headfirst设计模式(2)—观察者模式
- spring 内部工作机制(一)
- 2014年7月10日,我人生的最重要Upgrade
- python小练习: 给定一个数组 按重复次数 降序排列输出 数组非空且为正整数
- 【IOS】#import和#include有什么区别,@class呢,#import<;>;跟#import ";";有什么区别?
- SQL(ORACLE)
- Objective-C 性能监控
- c#day03
- vuex实践之路——笔记本应用(三)
- 深入HBase架构解析(二)【转】