美文网首页
序列化相关

序列化相关

作者: 知止9528 | 来源:发表于2020-10-09 22:03 被阅读0次

基本概念

序列化(编码)是将对象序列化为二进制形式(字节数组),主要用于网络传输、数据持久化等;
反序列化(解码)则是将从网络、磁盘等读取的字节数组还原成原始对象,主要
用于网络传输对象的解码,以便完成远程调用。


影响序列化性能的关键因素:

  1. 序列化后的码流大小(网络带宽的占用)
  2. 序列化的性能(CPU 资源占用)
  3. 是否支持跨语言(异构系统的对接和开发语言切换)。

几种常见序列化对比

序列化方式 简单说明 优点 缺点 适用场景
Java 默认提供的序列化 无法跨语言、序列化后的码流太大、序列化的性能差
XML 人机可读性好,可指定元素或特性的名称 1. 序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息;2. 只能序列化公共属性和字段;3 .不能序列化方法;4.文件庞大,文件格式复杂,传输占带宽。 当做配置文件存储数据,实时数据转换
JSON 是一种轻量级的数据交换格式 兼容性高、数据格式比较简单,易于读写、序列化后数据较小,可扩展性好,兼容性好、与 XML 相比,其协议比较简单,解析速度比较快。 数据的描述性比 XML 差、不适合性能要求为 ms 级别的情况、额外空间开销比较大 可替代XML:跨防火墙访问, 可调式性要求高 ,基于 Webbrowser 的 Ajax 请求,传输数据量相对小,实时性要求相对低(例如秒级别)的服务
Fastjson 采用一种“假定有序快速匹配”的算法。 接口简单易用、目前 java 语言中最快的 json 库 过于注重快,而偏离了“标准”及功能性、代码质量不高,文档不全。 过于注重快,而偏离了“标准”及功能性、代码质量不高,文档不全。
Thrift 不仅是序列化协议,还是一个 RPC 框架 序列化后的体积小, 速度快、支持多种语言和丰富的数据类型、对于数据字段的增删具有较强的兼容性、支持二进制压缩编码 使用者较少、跨防火墙访问时,不安全、不具有可读性,调试代码时相对困难、不能与其他传输层协议共同使用(例如 HTTP)、无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议 分布式系统的 RPC 解决方案
Avro Hadoop 的一个子项目,解决了 JSON 的冗长和没有 IDL 的问题 支持丰富的数据类型、简单的动态语言结合功能、具有自我描述属性、提高了数据解析速度、快速可压缩的二进制数据形式、可以实现远程过程调用 RPC、支持跨编程语言实现。 对于习惯于静态类型语言的用户不直观 在 Hadoop 中做 Hive、Pig 和 MapReduce的持久化数据格式。
Protobuf 将数据结构以.proto 文件进行描述,通过代码生成工具可以生成对应数据结构的POJO 对象和 Protobuf 相关的方法和属性。 序列化后码流小,性能高、结构化数据存储格式(XML JSON 等)、通过标识字段的顺序,可以实现协议的前向兼容、结构化的文档更容易管理和维护。 需要依赖于工具生成代码、支持的语言相对较少,官方只支持Java 、C++ 、python。 :对性能要求高的 RPC 调用、具有良好的跨防火墙的访问属性、适合应用层对象的持久化

其它
protostuff 基于 protobuf 协议,但不需要配置 proto 文件,直接导包即可
Jboss marshaling 可以直接序列化 java 类, 无须实 java.io.Serializable 接口
Message pack 一个高效的二进制序列化格式
Hessian 采用二进制协议的轻量级 remoting onhttp 工具
kryo 基于 protobuf 协议,只支持 java 语言,需要注册(Registration),然后序列化(Output),反序列化(Input)


序列化协议的选择

.具体场景

对于公司间的系统调用,如果性能要求在 100ms 以上的服务,基于 XML 的 SOAP 协议是一个值得考虑的方案。

基于 Web browser 的 Ajax,以及 Mobile app 与服务端之间的通讯,JSON 协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON也是非常不错的选择。

对于调试环境比较恶劣的场景,采用 JSON 或 XML 能够极大的提高调试效率,降低系统开发成本。

当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro 之间具有一定的竞争关系。
对于 T 级别的数据的持久化应用场景,Protobuf 和 Avro 是首要选择。如果持久化后的数据存储在 hadoop 子项目里,Avro 会是更好的选择。

对于持久层非 Hadoop 项目,以静态类型语言为主的应用场景,Protobuf 会更符合静态类型语言工程师的开发习惯。由于 Avro 的设计理念偏向于动态类型语言,对于动态语言为主的应用场景,Avro 是更好的选择。

如果需要提供一个完整的 RPC 解决方案,Thrift 是一个好的选择。

如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf 可以优先考虑。

protobuf详细说明

  1. protobuf 的数据类型有多种:bool、double、float、int32、int64、string、bytes、enum、message。
  2. protobuf 的限定符:required: 必须赋值,不能为空、optional:字段可以赋值,也可以不赋值、repeated: 该字段可以重复任意次数(包括 0 次)、枚举;只能用指定的常量集中的一个值作为其值;
  3. protobuf 的基本规则:
    (1)每个消息中必须至少留有一个 required 类型的字段、包含 0 个或多
    个 optional 类型的字段;
    (2)repeated 表示的字段可以包含 0 个或多个数据;
    (3);[1,15]之内的标识号在编码的时候会占用一个字节(常用),[16,2047]之内的标识号则占用 2 个字节,标识号一定不能重复、使用消息类型,也可以将消息嵌套任意多层,可用嵌套消息类型来代替组。
  4. protobuf 的消息升级原则
    (1)不要更改任何已有的字段的数值标识;
    (2)不能移除已经存在的required 字段,optional 和 repeated 类型的字段可以被移除,但要保留标号不能被重用。
    (3)新添加的字段必须是 optional 或 repeated。因为旧版本程序无法读取或写入新增的required 限定符的字段。

相关文章

  • Java 序列化 之 单例模式

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • java 序列化 原理解析

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • Java 序列化之 Externalizable

    相关文章: Java 序列化 之 Serializable JDK中除了提供 Serializable 序列化接口...

  • 什么是序列化?常见的序列化协议有哪些?

    序列化和反序列化相关概念 什么是序列化?什么是反序列化? 如果我们需要持久化 Java 对象比如将 Java 对象...

  • Java基础18:Java序列化与反序列化

    本文介绍了Java序列化的基本概念,序列化和反序列化的使用方法,以及实现原理等,比较全面地总结序列化相关知识点,并...

  • 序列化相关

    基本概念 序列化(编码)是将对象序列化为二进制形式(字节数组),主要用于网络传输、数据持久化等;反序列化(解码)则...

  • 序列化相关

    定义及相关概念 由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层,系统不认识对象,只认识字节序列,...

  • Android IPC机制2-AIDL的使用

    相关概念 序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deseria...

  • 序列化总结

    序列化总结 定义以及相关概念 序列化 将数据结构或者对象转成二进制串的过程 反序列化 将在序列化过程中所生成的二进...

  • python序列化模块json和pickle

    序列化相关 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化...

网友评论

      本文标题:序列化相关

      本文链接:https://www.haomeiwen.com/subject/fwvnuktx.html