为什么要将数据序列化?
写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
当需要将数据存入文件或者通过网络发送出去时,需将数据对象转化为字节流,即对数据序列化。
1. 数据序列化本质上是将JVM中链式存储的对象转化成连续存储的字节数组,这将极大的减少数据大小。
2. 对于每一个序列化的Java对象来说都有唯一的序列化 UID,这样可以保证在新的 JVM 中恢复对象即反序列化后同一个对象只会存在一份,这减少了内存的占用,同时也解决了对象之间依赖的问题。
补充
序列化技术是如何发展的?
考虑到性能、占用空间以及兼容性等因素,我们通常会经历以下几个阶段的技术演化,最终找到解决该问题的最优方案:
阶段1——字符串
不考虑任何复杂的序列化方案,直接将数据转化成字符串,以文本形式保存或传输,如果一条数据存在多个字段,则使用分隔符(比如“,”)分割。
该方案存储简单数据绰绰有余,但对于复杂数据,且数据模式经常变动时,将变得非常烦琐,通常会面临以下问题。
- 难以表达嵌套数据:如果每条数据是嵌套式的,比如存在类似于map,list数据结构时,以文本方式存储是非常困难的。
- 无法表达二进制数据:图片、视频等二进制数据无法表达,因为这类数据无法表示成简单的文本字符串。
- 难以应对数据模式变化:在实际应用过程中,由于用户考虑不周全或需求发生变化, 数据模式可能会经常发生变化。而每次发生变化,之前所有写入和读出(解析)模块均不可用,所有解析程序均需要修改,非常烦琐。
阶段2——编程语言内置序列化机制
采用编程语言内置的序列化机制,比如 Java Serialization, Python pickle等。
这种方式解决了阶段1面临的大部分问题,但随着使用逐步深入,我们发现这种方式将数据表示方式跟某种特定语言绑定在一起,很难做到跨语言数据的写入和读取。
阶段3——JSON/XML
为了解决阶段2面临的问题,我们决定使用应用范围广、跨语言的数据表示格式,比如JSON和XML。
但使用一段时间后,你会发现这种方式存在严重的性能问题:解析速度太慢,同时数据存储冗余较大,比如JSON会重复存储每个属性的名称等。
阶段4——统一schema
阶段4:到这一阶段,我们期望出现一种带有 schema描述的数据表示格式,通过统一化的 schema描述,可约束每个字段的类型,进而为存储和解析数据带来优化的可能。
此外,统一schema的引入,可减少属性名称重复存储带来的开销,同时,也有利于数据共享。
分布式系统中序列化框架该如何选择?
请参考我的另一篇博客——分布式系统中序列化框架该如何选择?
为什么要将数据序列化?相关推荐
- php serialize unserialize 数据序列化 与 反序列化
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得. 用一个类的时候都是new一下! 如果serialize 将数据序列化以后存到数据库中等 用的时候就不再new了 反序列化以 ...
- Java实现数据序列化工具Avro的例子
1.Avro简介 Avro是一个数据序列化的系统. 它可以提供: 1)丰富的数据结构类型 2)快速可压缩的二进制数据形式 3)存储持久数据的文件容器 4)远程过程调用RPC 5)简单的动态语言结合功能 ...
- 【Flask项目2】python对象分页数据序列化基类(5)
comment-utils-serializer.py文件 class BasePaginateSerializer(object):"""分页数据序列化基类" ...
- python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)
一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...
- 常用模块(数据序列化 json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- python pickle模块:数据序列化和反序列化
pickle模块是python中数据序列化和反序列化的一个包,该模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构 ...
- jsonpickle数据序列化
json&pickle数据序列化 json 用于字符串和python数据类型间进行转换 pickle 用于python特有的类型 和 python的数据类型间进行转换序列化:把字典或者字符串的 ...
- python读取序列5之后的数据_Python 基本功: 5. 数据序列化
这篇文章紧接着前篇:多多教Python:Python 基本功: 4. 读写文件zhuanlan.zhihu.com 仔细阅读的小伙伴会发现,在基本功4 里最后的一个示例中,我们读取解析了文件中的内容 ...
- 高效数据序列化的工具 FlatBuffers 的初体验
2019独角兽企业重金招聘Python工程师标准>>> 1. 背景 最近在项目中需要使用一种高效数据序列化的工具.碰巧在几篇文章中都提到了FlatBuffers 这个库.特别是 An ...
- 浅谈C# XML WebServer数据序列化及数据压缩
由于公司近期业务的需要,本要研究一些有关 XML WebServer下数据序列化及数据压缩的实现问题,现与大家分享一下,也希望大家勇于讨论,互相学习.由于要实现网络传输入,考虑到操作系统.网络性能等几 ...
最新文章
- 使用jquery获取url以及jquery获取url参数的方法
- 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
- wpf 放大缩小界面_调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程...
- 缓冲流、转换流、序列化流
- Spring开发包介绍
- 使用Flying-Saucer生成PDF中的条形码
- 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向
- 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现
- 小米折叠手机高清渲染图曝光:双外折叠形态美如画
- 用电饭锅做蛋糕的做法
- python从某个字符串开始截取_Python字符串的截取
- 函数对象、对象、原型
- Forms验证中的roles(转)
- 文字在div中的垂直居中问题 div在页面中的水平垂直居中问题 vertical-align ??????
- 红米2 miui android5.1,Redmi 2 MIUI7 Android 5.1闪回到Android 4.4和第三方Rec更新5
- Intellij IDEA 中使用 JUnit4 进行单元测试
- scrapy中文网学习笔记
- 腾讯云TRTC —— 实时音视频完整案例 音视频+共享屏幕直播
- sysdig_Sysdig: 系统故障排查利器
- 下载spotify音乐_如何将Google Maps音乐控件用于Spotify,Apple Music或Google Play音乐
热门文章
- Linux 编辑器 !强推!
- Android下拉刷新和上拉加载更多
- 三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)
- 我的2013拾遗总结~ 多么痛的领悟!
- mysql模糊搜索 like_Mysql必知必会(3):模糊查询(LIKE)
- git clone出现 fatal: unable to access ‘https://github.com/...‘resolve host: ds-git.gree.com的解决办法
- html作品简介代码,HTML5的标签的代码的简单介绍 HTML5标签的简介
- 【IT项目管理】第4章 习题
- 词云图制作(wordcloud pyecharts)
- 2020最新安卓版本是多少_元气骑士2020最新角色兑换码 IOS、安卓礼包码大全领取攻略...