序列化反序列化之浅谈
程序员文章站
2022-05-14 17:13:50
...
这篇文章仅仅是我自己对序列化的理解,如有错误与不足之处欢迎大家指正,谢谢。
前两天一个测试同学问我:“什么是序列化?“。我当时先是一愣,擦,什么时候测试同学都开始研究这么高深的问题了。。。我完全处于懵逼的状态。经过短暂的懵逼之后我条件反射式得脱口而出:就是把对象转成二进制形式。(因为我本人是从事java开发工作,所以就不暇思索得把java中的序列化概念脱口而出)。测试同学听了我的回答也是一副懵逼面容。我马上改口说这个我得查查资料才能解释。我开始想序列化到底是干嘛的?它的本质是什么?
我开始百度看网上的回答:其中刘丁的文章让我获益匪浅其博文地址是:https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html。刘丁的这篇讲得很到位,而我只想用简单的话告诉大家这个序列化到底要干嘛?可能有一定基础的人会马上会答:不就是为了实现持久化存储或者网络传输嘛。对,你说的对。但是,你有没有想过为啥非要经过序列化后才能进行持久化存储或者网络传输?你有没有思考过将对象转成二进制这句话?
在计算机中所有的东西都是二进制存在的,包括程序运行时的各种对象(数据结构)在内存中也是以二进制形式存在的。他们本身就是二进制的为啥还要转成二进制?同样不经过序列化的对象当然可以进行持久化存储也可以在网络上传输,因为它本身就是以二进制存在的。如果不经过序列化就存储或者在网络上传输这样会引出一个问题。你的对象是存储了或者在网络上传给其他机器了。假如我们应用层没有使用任何传输协议,其他机器拿到的就是一堆100111000111....0010001....这样的二进制序列。收到这串数据的这台机器要疯了,擦,这该按照什么协议去解析或者按照什么规则去解析呢?这就引入了协议(protocol)的概念。协议就是元数据(描述数据的数据)。协议描述了一台机器应该如何(按照什么规则)去解析收到的100111000111....0010001....这个二进制序列。而序列化的本质就是按照双方既定的规则(协议)去将对象(二进制序列)重新加工成一个新的二进制序列。这样我的对象的二进制序列就包含在这个序列化后的新二进制序列中,及size_of(序列化之后的新二进制序列) > size_of(原生二进制序列),也就是给这个对象的二进制序列加了一些描述信息,诸如对象的字段顺序,类型,长度(这里是在解释java的序列化本质,当然其他的序列化也是这个道理),当其他机器拿到这个数据之后就会根据既定的协议去解析这个100111000111....0010001....。说到这里序列化就是:按照某一规则去重新加工的原生二进制序列,给它添加相应的描述信息,以方便后续的再按照当时的规则去解析。说到这里HTTP协议就是一个序列化规则。
刘丁在其文章中说了很多序列化协议(规则):XML,SOAP,JOSN。。。等等。当然java有自己的对象序列化协议。序列化的目的是为了实现机器之间的交流。
暂时就写到这里了,仅供参考。
上一篇: PHP获取QQ达人QQ信息的方法_PHP
推荐阅读
-
Python开发之序列化与反序列化:pickle、json模块使用详解
-
IOS开发(74)之把 Array 和 Dictionaries 序列化成 JSON 对象
-
19.DjangoRestFramework学习二之序列化组件、视图组件
-
干货系列性能篇之——序列化
-
SQLServer之创建事务序列化
-
Python 序列化模块(json,pickle,shelve) 百日筑基之得气(三)
-
Newtonsoft.Json 序列化踩坑之 IEnumerable
-
浅谈C# 序列化与反序列化几种格式的转换
-
SpringBoot整合SpringMVC之自定义JSON序列化器和反序列化器
-
DjangoRestFramework学习二之序列化组件