在日常项目中,我们经常都会和序列化三个字打交道。常用的各种库和语言都集成了序列化的功能。
c++ 的Boost库 java ,c# 都实现了此功能,程序设计者只需要调用接口选择要序列化的数据即可序列化 反序列化,将内存中的数据转化为二进制数据存储进本地。
那么问题就来了:
对象在内存中的数据本来就是二进制的啊!我们直接拷贝对象对象在内存中的数据写入本地磁盘即可啊。那为什么我们还需要序列化框架来做这件事情?
网上关于序列化的介绍都直说 : 序列化是为了持久化内存中的对象。但并没有介绍为什么不直接拷贝内存中的对象。所以只有自己去领会其中的精髓。
这是本人的关于为什么不直接拷贝内存中的数据来实现持久化的一些见解,如有错误,欢迎指正:
首先来对比两种实现方式功能完备性:
1
手动拷贝内存数据 | 框架提供的序列化机制 | |
持久化 | ok | ok |
筛选某些属性不存储 | no | ok |
防止重复存储 | no | ok |
筛选某些属性不存储:比如一个对象里你创建了一个缓存对象用于缓存某些数据,这些缓存数据在每次功能使用的时候才生效,所以存入本地并无意义,为了节省硬盘空间,应该在序列化的时候将其去掉。
防止重复储存: 相同的对象总是不希望重复存储的 。即使有改变,也应该在原来存储的地方修改对应的值就可以了。
由此可见:
序列化所做的工作除了将数据以二进制存入本地外,还要提供筛选数据,防止重复存储等功能,而这些功能的实现就要求用户告诉功能设计者要存储的对象有哪些希望序列化的数据,基于这种设计理念,最终形成了大多数框架所采用的:用户在接口内输入需要序列化的数据及策略 ,框架将其序列化。
总结:
问:为什么要序列化?
答: 为了持久化内存数据和传输内存数据
问: 为什么要采用框架提供的序列化,直接拷贝内存数据不就行了么?
答:直接拷贝内存数据无法达到如防止重复存储,筛选数据等功能。