写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

当需要将数据存入文件或者通过网络发送出去时,需将数据对象转化为字节流,即对数据序列化。
1. 数据序列化本质上是将JVM中链式存储的对象转化成连续存储的字节数组,这将极大的减少数据大小。
2. 对于每一个序列化的Java对象来说都有唯一的序列化 UID,这样可以保证在新的 JVM 中恢复对象即反序列化后同一个对象只会存在一份,这减少了内存的占用,同时也解决了对象之间依赖的问题。

补充

序列化技术是如何发展的?

考虑到性能、占用空间以及兼容性等因素,我们通常会经历以下几个阶段的技术演化,最终找到解决该问题的最优方案:

阶段1——字符串

不考虑任何复杂的序列化方案,直接将数据转化成字符串,以文本形式保存或传输,如果一条数据存在多个字段,则使用分隔符(比如“,”)分割。

该方案存储简单数据绰绰有余,但对于复杂数据,且数据模式经常变动时,将变得非常烦琐,通常会面临以下问题。

  1. 难以表达嵌套数据:如果每条数据是嵌套式的,比如存在类似于map,list数据结构时,以文本方式存储是非常困难的。
  2. 无法表达二进制数据:图片、视频等二进制数据无法表达,因为这类数据无法表示成简单的文本字符串。
  3. 难以应对数据模式变化:在实际应用过程中,由于用户考虑不周全或需求发生变化, 数据模式可能会经常发生变化。而每次发生变化,之前所有写入和读出(解析)模块均不可用,所有解析程序均需要修改,非常烦琐。

阶段2——编程语言内置序列化机制

采用编程语言内置的序列化机制,比如 Java Serialization, Python pickle等。

这种方式解决了阶段1面临的大部分问题,但随着使用逐步深入,我们发现这种方式将数据表示方式跟某种特定语言绑定在一起,很难做到跨语言数据的写入和读取。

阶段3——JSON/XML

为了解决阶段2面临的问题,我们决定使用应用范围广、跨语言的数据表示格式,比如JSON和XML。

但使用一段时间后,你会发现这种方式存在严重的性能问题:解析速度太慢,同时数据存储冗余较大,比如JSON会重复存储每个属性的名称等。

阶段4——统一schema

阶段4:到这一阶段,我们期望出现一种带有 schema描述的数据表示格式,通过统一化的 schema描述,可约束每个字段的类型,进而为存储和解析数据带来优化的可能。

此外,统一schema的引入,可减少属性名称重复存储带来的开销,同时,也有利于数据共享。

分布式系统中序列化框架该如何选择?

请参考我的另一篇博客——分布式系统中序列化框架该如何选择?

为什么要将数据序列化?相关推荐

  1. php serialize unserialize 数据序列化 与 反序列化

    序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得. 用一个类的时候都是new一下! 如果serialize 将数据序列化以后存到数据库中等  用的时候就不再new了 反序列化以 ...

  2. Java实现数据序列化工具Avro的例子

    1.Avro简介 Avro是一个数据序列化的系统. 它可以提供: 1)丰富的数据结构类型 2)快速可压缩的二进制数据形式 3)存储持久数据的文件容器 4)远程过程调用RPC 5)简单的动态语言结合功能 ...

  3. 【Flask项目2】python对象分页数据序列化基类(5)

    comment-utils-serializer.py文件 class BasePaginateSerializer(object):"""分页数据序列化基类" ...

  4. python建立数据库并序列化_Python之数据序列化(json、pickle、shelve)

    一.python类型数据和JSON数据格式互相转换 pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object 二. 序列化/反序列化 将对象转换为可通 ...

  5. 常用模块(数据序列化 json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  6. python pickle模块:数据序列化和反序列化

      pickle模块是python中数据序列化和反序列化的一个包,该模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构 ...

  7. jsonpickle数据序列化

    json&pickle数据序列化 json 用于字符串和python数据类型间进行转换 pickle 用于python特有的类型 和 python的数据类型间进行转换序列化:把字典或者字符串的 ...

  8. python读取序列5之后的数据_Python 基本功: 5. 数据序列化

    这篇文章紧接着前篇:多多教Python:Python 基本功: 4. 读写文件​zhuanlan.zhihu.com 仔细阅读的小伙伴会发现,在基本功4 里最后的一个示例中,我们读取解析了文件中的内容 ...

  9. 高效数据序列化的工具 FlatBuffers 的初体验

    2019独角兽企业重金招聘Python工程师标准>>> 1. 背景 最近在项目中需要使用一种高效数据序列化的工具.碰巧在几篇文章中都提到了FlatBuffers 这个库.特别是 An ...

  10. 浅谈C# XML WebServer数据序列化及数据压缩

    由于公司近期业务的需要,本要研究一些有关 XML WebServer下数据序列化及数据压缩的实现问题,现与大家分享一下,也希望大家勇于讨论,互相学习.由于要实现网络传输入,考虑到操作系统.网络性能等几 ...

最新文章

  1. 使用jquery获取url以及jquery获取url参数的方法
  2. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
  3. wpf 放大缩小界面_调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程...
  4. 缓冲流、转换流、序列化流
  5. Spring开发包介绍
  6. 使用Flying-Saucer生成PDF中的条形码
  7. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向
  8. 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现
  9. 小米折叠手机高清渲染图曝光:双外折叠形态美如画
  10. 用电饭锅做蛋糕的做法
  11. python从某个字符串开始截取_Python字符串的截取
  12. 函数对象、对象、原型
  13. Forms验证中的roles(转)
  14. 文字在div中的垂直居中问题 div在页面中的水平垂直居中问题 vertical-align ??????
  15. 红米2 miui android5.1,Redmi 2 MIUI7 Android 5.1闪回到Android 4.4和第三方Rec更新5
  16. Intellij IDEA 中使用 JUnit4 进行单元测试
  17. scrapy中文网学习笔记
  18. 腾讯云TRTC —— 实时音视频完整案例 音视频+共享屏幕直播
  19. sysdig_Sysdig: 系统故障排查利器
  20. 下载spotify音乐_如何将Google Maps音乐控件用于Spotify,Apple Music或Google Play音乐

热门文章

  1. Linux 编辑器 !强推!
  2. Android下拉刷新和上拉加载更多
  3. 三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)
  4. 我的2013拾遗总结~ 多么痛的领悟!
  5. mysql模糊搜索 like_Mysql必知必会(3):模糊查询(LIKE)
  6. git clone出现 fatal: unable to access ‘https://github.com/...‘resolve host: ds-git.gree.com的解决办法
  7. html作品简介代码,HTML5的标签的代码的简单介绍 HTML5标签的简介
  8. 【IT项目管理】第4章 习题
  9. 词云图制作(wordcloud pyecharts)
  10. 2020最新安卓版本是多少_元气骑士2020最新角色兑换码 IOS、安卓礼包码大全领取攻略...