专栏首页TopCoder数据序列化的那些事

数据序列化的那些事

戳蓝字「TopCoder」关注我们哦!

编者注:关于数据序列化,首先要了解为什么需要序列化以及数据序列化的意义是什么,然后再了解下当前较为广泛的几种序列化方式。

为什么需要数据序列化呢?因为数据要“传输”,比如将数据网络通信传递给其他服务器,或者持久化到磁盘。那么传输为什么需要序列化呢?因为在内存中的数据,当前进程是知道数据格式和内容的,但是数据传输是二进制(或文本格式),所以需要有一个内存数据格式转换为二进制(或文本格式)的过程。数据序列化,可以进行数据压缩、数据格式多语言兼容等。下面就按照序列化的技术演变过程一起看下序列化的发展之路。

文本格式序列化

直接将数据转变为文本格式,也就是字符串形式的文本保存,如果一个数据存在多个字段可使用固定分隔符(比如",")分隔,该方案存储简单但是针对复杂对象比如嵌套数据,存储起来较为麻烦,并且无法表示本来就是二进制格式的数据,比如图片、视频等。

语言内置序列化

目前编程语言基本都内置了至少一种数据序列化机制,比如Java的 Serialization、Python的pickle等,语言内置的序列化机制大都和该语言绑定,也就是说反序列化也必须是该语言才行,因此很难做到跨语言的读取写入。

跨语言序列化

语言内置的序列化大都和语言绑定,因此有了应用范围广泛、跨语言的数据序列化格式,例如json、xml等,但是这些跨语言序列化方案存在的最大劣势就是有性能问题,并且无数据类型信息,同时数据序列化冗余较大,比如json会保存每个属性名字。除了json和xml这种跨语言序列化之外,还有类似于hession这种跨语言序列化(这是序列化框架本身支持跨语言,目前只会Python/Java/C++等)的机制,序列化数据是二进制格式,并且包含数据类型信息。

带schema描述序列化

带有schema描述的数据表示格式,通过统一化的schema描述,可约束每个字段的类型,进而为存储和解析数据带来优化的可能。此外,统一schema的引入,可减少属性名称重复存储带来的开销,同时,也有利于数据共享。带有schema描述的序列化常用的有Thrift、Protocol Buffers和Avro,它们一般被称为Language Of Data,使得跨语言序列化成为可能,并且它们提供了代码生成工具,方便为开发者生成各个语言的代码。Language Of Data具有特性如下:

  • 提供IDL(Interface Description language)用以描述数据schema,用来定义结构化或者非结构化数据;
  • 跨语言支持,至少支持Java、Python和C/C++
  • 数据编码压缩,比如字符串压缩和整数变长编码等;
  • 数据序列化兼容,保证序列化的向后兼容性,比如旧schema序列化的数据可由新schema反序列化,新schema序列化也可以由旧schema解析等。

关于protobuf为什么这么快可以参考文档:https://www.jianshu.com/p/72108f0aefca。

本文分享自微信公众号 - TopCoder(gh_12e4a74a5c9c),作者:南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 常见限流方案设计与实现

    编者注:高并发系统设计的3个利器:缓存、限流、降级,本文就限流相关算法,分析其设计与实现。

    luoxn28
  • 网络数据是如何传递给进程的

    在用户态空间,调用发送数据接口 send/sento/wirte 等写数据包,在内核空间会根据不同的协议走不同的流程。以TCP为例,TCP是一种流协议,内核只是...

    luoxn28
  • sentinel 集群流控原理

    为什么需要集群流控呢?假设需要将某个API的总qps限制在100,机器数可能为50,这时很自然的想到使用一个专门的server来统计总的调用量,其他实例与该se...

    luoxn28
  • Java基础-序列化与反序列化

    序列化和反序列化在面试中也经常考查,下面就总结一下 Java 中的序列化和反序列化。

    Wizey
  • Serializable和Parcelable的再次回忆

    自己开发Android也有些时间了,Serializable和Parcelable遇到过不止一次了。但是每次别人问起具体的内容自己偏偏记得不是很清晰。因为某些原...

    静默加载
  • 序列化框架的选型和比对

    大白话介绍下 RPC 中序列化的概念,可以简单理解为对象 –> 字节的过程,同理,反序列化则是相反的过程。

    用户5325874
  • Java序列化连环炮:是什么?为什么需要?如何实现?

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题

    用户4143945
  • Java序列化 3 连问

    Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程:

    xcbeyond
  • Java 序列化机制

    1、一般情况下,只有当 JVM 处于运行时,Java 对象才可能存在,即这些对象的生命周期不会比 JVM 的生命周期更长。但在现实应用中,就可能要求在 JVM ...

    JMCui
  • C# 特性(Attribute)之Serializable特性

    本文参考自Serializable 作用,纯属读书笔记,加深记忆 介绍之前,先说一个重要的知识点: Serializable属性并不序列化类,它只是一个标签。至...

    郑小超.

扫码关注云+社区

领取腾讯云代金券