thrift, Protocol Buffers and MsgPack 的序列化对比

2023-05-16

啥是序列化?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

为啥要序列化?

  1、以某种存储形式使自定义对象持久化

  2、将对象从一个地方传递到另一个地方。
  3、使程序更具维护性
以上摘自百度百科。


一般的,在做网络服务架构的时候,需要同步数据,为了保证数据的可用性,在传输数据之前需要对数据进行序列化的操作。对于多种服务之间的数据传输,涉及到了几个会影响架构选择的问题:

  • 效率
  • 接口的耦合性(即一台服务器升级了接口,其它服务器是否需要执行同步升级,旧的服务器是否能够兼容升级的数据接口)
  • 语言的扩展性
  • 数据结构的支持
效率
一般对于网络服务来说,效率是一个非常重要的衡量因素。因此,需要细致的考量该问题。关于效率对比,在网上有很多的数据,在这里,笔者还是做了简单的测试。
接口的耦合性
关于接口的耦合性,在这里只对thrift和Protocol Buffers进行说明,因为msgpack确定是耦合的。如果服务端和客户端的接口定义不一致,必定造成读写错误,这里对msgpack就不再赘述。
  • thrift    ☆☆
    为了测试增加了接口是否仍然可用,笔者写了如下测试代码:
    struct Person{                                                                                                                               
            1:i64 id, 
            2:string name
    }
    
    struct Student{
            1:i64 id, 
            2:string name,
            3:string school
    }
    
    struct Student2{
            1:i64 id, 
            2:string school,
            3:string name
    }
    
    struct Student3{
            1:i64 id, 
            2:double fee = 10000.0,
            3:string school,
            4:string name
    }
    以上的是thrift的定义文件,假定Person是老接口,Student系列是升级的几个接口。
    进行序列化和反序列化的代码如下:
        using apache::thrift::transport::TMemoryBuffer;
        using apache::thrift::protocol::TBinaryProtocol;
        using boost::shared_ptr;
    
        shared_ptr<TMemoryBuffer> strBuffer(new TMemoryBuffer());
        shared_ptr<TBinaryProtocol> binaryProtcol(new TBinaryProtocol(strBuffer));
    
        Student3 a;
        a.id = 10; 
        a.name ="holla back a";
        a.school = "pku";                                                                                                                        
    
        a.write(binaryProtcol.get());
        std::string serialized = strBuffer->getBufferAsString();
    
        shared_ptr<TMemoryBuffer> strBuffer2(new TMemoryBuffer());
        shared_ptr<TBinaryProtocol> binaryProtcol2(new TBinaryProtocol(strBuffer2));
    
        strBuffer2->resetBuffer((uint8_t*)serialized.data(), serialized.length());
        Person a2; 
        a2.read(binaryProtcol2.get());
    

    如上是核心的测试代码,测试方法为发送不同的Student数据,查看收到的person数据是否正常。
    测试结果如下:
    Student和person可以完全实现传输;Student2传给person之后,person的name字段对应到了Student2的school字段;Student3传输给person之后,name字段为空(对应的位置上为double)。
    根据以上的测试结果得出结论:
    当且仅当不改变原有接口数据顺序以及类型的前提下,通过在结构的后端增加数据,不影响两端的通信。
    至于原理,可以查看产生代码的read以及write方法的源代码,此文档中也有一些探讨 http://www.cnblogs.com/egmkang/archive/2011/05/14/2046335.html
    P.S. thrift支持嵌套的数据类型结构,例如,一个新的数据类型可以定义如下:
    struct Company{
        1:i64 id,
        2:string name,
        3:list<i64>ids,
        4:set<i64>iSet,
        5:map<i64, string> iMap,
        6:Student s//OK
    } 

  • Protocol Buffers    ☆☆☆☆
    由于protocol buf 中存在required,optional,以及repeated字段,所以,protocol buf是接口耦合性最低的一种序列化方式。
语言扩展性
  • thrift 
    Available generators (and options):
      as3 (AS3):
        bindable:          Add [bindable] metadata to all the struct classes.
      c_glib (C, using GLib):
      cocoa (Cocoa):
        log_unexpected:  Log every time an unexpected field ID or type is encountered.
      cpp (C++):
        cob_style:       Generate "Continuation OBject"-style classes.
        no_client_completion:
                         Omit calls to completion__() in CobClient class.
        templates:       Generate templatized reader/writer methods.
        pure_enums:      Generate pure enums instead of wrapper classes.
        dense:           Generate type specifications for the dense protocol.
        include_prefix:  Use full include paths in generated files.
      csharp (C#):
      delphi (delphi):
        ansistr_binary:  Use AnsiString as binary properties.
      erl (Erlang):
      go (Go):
      hs (Haskell):
      html (HTML):
      java (Java):
        beans:           Members will be private, and setter methods will return void.
        private-members: Members will be private, but setter methods will return 'this' like usual.
        nocamel:         Do not use CamelCase field accessors with beans.
        hashcode:        Generate quality hashCode methods.
        android_legacy:  Do not use java.io.IOException(throwable) (available for Android 2.3 and above).
        java5:           Generate Java 1.5 compliant code (includes android_legacy flag).
      javame (Java ME):
      js (Javascript):
        jquery:          Generate jQuery compatible code.
        node:            Generate node.js compatible code.
      ocaml (OCaml):
      perl (Perl):
      php (PHP):
        inlined:         Generate PHP inlined files
        server:          Generate PHP server stubs
        autoload:        Generate PHP with autoload
        oop:             Generate PHP with object oriented subclasses
        rest:            Generate PHP REST processors
        namespace:       Generate PHP namespaces as defined in PHP >= 5.3
      py (Python):
        new_style:       Generate new-style classes.
        twisted:         Generate Twisted-friendly RPC services.
        utf8strings:     Encode/decode strings using utf8 in the generated code.
        slots:           Generate code using slots for instance members.
        dynamic:         Generate dynamic code, less code generated but slower.
        dynbase=CLS      Derive generated classes from class CLS instead of TBase.
        dynexc=CLS       Derive generated exceptions from CLS instead of TExceptionBase.
        dynimport='from foo.bar import CLS'
                         Add an import line to generated code to find the dynbase class.
      rb (Ruby):
      st (Smalltalk):
      xsd (XSD):
    不多说了,敲下thrift命令,啥都支持啊。。。
  • msgpack  ☆
    ruby、python、perl、C/C++、php、C#、java、js....... 几乎没有不支持的,可以参考主页http://msgpack.org/
  • protocol buffer 
    和上述两个吓人的家伙比起来,有点拿不出手啊:java、c++ 和 python

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

thrift, Protocol Buffers and MsgPack 的序列化对比 的相关文章

  • C++各类库

    1 C 43 43 各大有名库的介绍 C 43 43 标准库 2 C 43 43 各大有名库的介绍 准标准库Boost 3 C 43 43 各大有名库的介绍 GUI 4 C 43 43 各大有名库的介绍 网络通信 5 C 43 43 各大有
  • watch 50 行代码实现 windows watch

    watch 50 行代码实现 windows watch 最近想监控 gpu 使用情况 xff0c 无奈在 windows 上没有 watch 指令 xff0c nvidia smi lms 20 自带输出也不美观 xff0c 那么为何不自
  • intel CPU 命名含义

    https www intel com content www us en processors processor numbers html
  • 使用 c++ 如何一行行的读取文本数据?

    使用 std getline 函数读取文件行 https en cppreference com w cpp string basic string getline 下面进行不同写法读取文件行的方式的比较 for std string li
  • android NDK 如何使用 JNI 与 Java&Kotlin 语言交互?

    android NDK 如何使用 JNI 与 Java amp Kotlin 语言交互 xff1f http web archive org web 20120626135526 http java sun com docs books j
  • 海康威视摄像头 rtsp 地址格式

    海康威视摄像头 rtsp 地址格式 单播取流格式 rtsp username password 64 ip port Steaming Channels number 多播取流格式 rtsp username password 64 ip
  • debian 11.3 国内最快镜像源

    debian 11 3 国内最快镜像源 deb https mirrors tencent com debian bullseye main non free contrib deb src https mirrors tencent co
  • golang 如何自定义解析 markdown to html ?

    golang 如何自定义解析 markdown to html xff1f 输出 HTML 模板内容如下 span class token doctype span class token punctuation lt span span
  • 如何计算 2d 多边形面积?

    如何使用 C 43 43 11 30 行代码搞定计算 2D 多边形面积 xff1f 完整代码如下 xff1a include lt vector gt include lt utility gt using Point 61 std pai
  • 怎样为MFC对话框建立初始化函数BOOL HistoryData::OnInitDialog()

    一 在要建立OnInitDialog 的对话框上右击建立类向导 xff0c 如下图 xff1a 二 为对话框建立消息映射 xff0c 如下图 xff1a 在classwizard的Message Maps中的Object IDs选择该对话框
  • 颜色值如何使用 C++ 输出字符串格式?

    颜色值如何使用 C 43 43 输出字符串格式 xff1f https developer android com reference android graphics Color html https en wikipedia org w
  • 如何使用 opencv 调用 yolov5 onnx 模型 ?

    如何使用 opencv 调用 yolov5 onnx 模型 xff1f rtx3090 24G release 90 fps by use yolov5n rtx3090 24G release 20 fps by use yolov5s
  • Conda 备忘录指南 (VER 4.12.0)

    Conda 备忘录指南 VER 4 12 0 快速入门 提示 建议为任何新项目或工作流创建一个新环境 CNENCMD验证conda安装和检查版本verify conda install and check versionconda info
  • 使用 C++ filesystem 递归目录

    如何使用 C 43 43 filesystem 递归目录 xff1f include lt Windows h gt include lt iostream gt include lt string gt include lt fstrea
  • CMake 如何复制文件?

    何时执行自定义指令 PRE BUILD PRE LINK POST BUILD 单文件 add custom command TARGET PROJECT NAME POST BUILD COMMAND CMAKE COMMAND E co
  • 什么是 MQ?

    消息队列 MQ 是在微服务架构中使用的异步服务到服务通信协议 在 MQ 中 xff0c 消息被排队 xff0c 直到它们被处理和删除 每条消息只处理一次 此外 xff0c MQ 可用于解耦重量级处理 缓冲和批处理工作 消息队列提供系统不同部
  • Qt 如何并发异步调用?

    Qt 如何并发异步调用 xff1f QT 43 61 core concurrent widgets template lt typename T typename Handler gt void await const QFuture l
  • 如何使用 C++ 构建一个环结构?

    C 43 43 环状移动 include lt iostream gt include lt list gt int main auto list 61 std list lt int gt 1 3 5 7 9 for auto i 61
  • C++ std::thread 如何使用?

    C 43 43 是一种高级编程语言 xff0c 被广泛用于开发高性能 大规模 复杂的软件系统 其中一个强大的特性就是多线程编程 xff0c 而std thread是C 43 43 标准库提供的多线程支持的重要组成部分 免费虚拟手机号注册网址
  • 导航雷达回波信号格式和目标检测算法

    导航雷达回波信号格式 导航雷达回波信号格式会根据具体的雷达类型和应用场景有所不同 通常 xff0c 导航雷达回波信号包含以下几个关键参数 xff1a 距离信息 xff08 Range xff09 xff1a 雷达发送的电磁波与目标相互作用后

随机推荐

  • 厦门IT公司名单及联系方式

    厦门高士达科技实业有限公司 xff1a xff08 已走访并开展了座谈 xff09 地址 xff1a 厦门软件园观日路58号9楼 总机 xff1a 2958000 联系人 xff1a 童小姐 xff08 人事专员 xff09 厦门恒深智能软
  • 巧用可变参数宏、编译器内置宏和printf输出调试信息

    前言 xff1a 我们在写程序的时候 xff0c 总是或多或少会加入一些printf之类的语句用于输出调试信息 xff0c 但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除 xff0c 而一旦需要
  • STM32外设寄存器地址定义

    一直都是用STM32做项目中的主控芯片 xff0c 在编程的时候 xff0c 之前一直忽视了一个问题 xff0c 那就是寄存器的位置是如何定义的 xff0c 为什么用一个USART1 gt CR操作就能够给这个CR寄存器赋值 xff1f 其
  • CoppeliaSim ( vrep ) 与 c++ ( visual studio 2019)新建基本工程

    CoppeliaSim vrep 与 c 43 43 xff08 visual studio 2019 xff09 新建基本工程 文章目录 CoppeliaSim vrep 与 c 43 43 xff08 visual studio 201
  • windows-rbdl-vs2019

    根据源码提示 xff0c 在项目属性 c 43 预处理器 预处理定义中加入定义 ifndef RBDL BUILD ADDON URDFREADER error 34 Error RBDL addon URDFReader not enab
  • 2021-11-11 机械臂路径规划学习进展

    机械臂关节空间和末端空间路径规划 关节空间路径规划简单障碍物情况 xff1a 之后搭建复杂障碍物场景 xff1a 测试发现路径规划的两个步骤 xff1a 采用了关节空间进行路径规划的方案 xff0c 原因主要是在关节空间也就是构型空间中 x
  • 2021-11-12 轨迹规划了解

    1 机器人中的轨迹规划 曲线柔顺 xff1a 五次多项式曲线 起终点位置 速度 加速度约束六个方程 虽然这三条曲线都是连续且光滑的 xff0c 但却存在一个很实际的问题 从速图曲线中可以看出在t 61 25时速度达到最大值 xff0c 没有
  • 【轨迹规划】c++ vector<vector<double>>数据传递

    轨迹信息传递 span class token macro property span class token directive hash span span class token directive keyword include s
  • 2022-3-9 Ubuntu 16 安装opencv 4.5

    ubuntu 16安装 OpenCV 3 的教程 也是安装OpenCV 3 Ubuntu 18 安装 OpenCV 4 5 的 安装完成后 xff0c 手动创建opencv pc xff1a cd usr local lib sudo mk
  • 2022-4-21 vrep深度相机Kinect 远程c++(qtcreator) opencv 保存

    从模型库里拉出来一个Kinect相机放在合适位置 xff1a 设置好像素 xff0c 不是标准像素值vrep有警告 xff08 可能数据有误 xff09 xff0c 忽略即可 同样的像素值 xff0c 在c 43 43 端 xff1a sp
  • 20220905 buffer overflow detected

    hit 64 hit span class token operator span span class token operator span span class token operator span gitprojects span
  • 泉州IT公司名录

    超牌电子有限公司 18259571509 福建泉州超牌电子有限公司成立于1997年 xff0c 是一家自主研发 生产和销售移动电源 xff0c 应急充电器等一系列锂电池为 地址 福建泉州 主营产品 移动电源 虹科安防 18060109697
  • 2023-2-24 pagmo2安装测试

    content 安装必要依赖安装boost安装TBB 安装pagmo 安装必要依赖 安装boost 依赖boost版本大于1 68 boost官网下载 安装boost 安装包解压缩后 span class token punctuation
  • 2023-4-23 Windows和Ubuntu使用网线直连搭建局域网

    1 Windows下的配置 xff1a 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP IPv4 IP地址 xff08 192 168 1 3 xff09 子网掩码 xff08 2
  • traj_out variable ‘std:ofstream’ has initializer but incomplete type

    variable 39 std ofstream has initializer but incomplete type 或者是variable 39 std ifstream has initializer but incomplete
  • perl处理excelwenjian

    usr bin perl use strict use Win32 OLE qw in with use Win32 OLE Const 39 Microsoft Excel 39 Win32 OLE Warn 61 3 die on er
  • C++ox 之 lambda

    http www cnblogs com allenlooplee archive 2012 07 03 2574119 html 今天看了博文 xff0c 之前对于lambda的理解比较粗陋 xff0c 今天再学习一下 不得不说我是一个极
  • __x_a != __x_a什么时候不成立?

    define isnan x extension typeof x x a 61 x builtin expect x a 61 x a 0 在看redis源码的时候发现了一个有趣的东西 xff0c 这个宏对是否是有效的实数进行了判断 这个
  • pthread_mutex_trylock的问题及解决

    在需要使用非阻塞的锁时 xff0c trylock是一个比较好的选择 xff0c 但是使用的时候碰见了一些问题 xff1a 需要使用PTHREAD MUTEX ERRORCHECK NP 来定义一个检错锁 xff0c 但是不管如何都编译不过
  • thrift, Protocol Buffers and MsgPack 的序列化对比

    啥是序列化 xff1f 序列化是将对象状态转换为可保持或传输的格式的过程 与序列化相对的是反序列化 xff0c 它将流转换为对象 这两个过程结合起来 xff0c 可以轻松地存储和传输数据 为啥要序列化 xff1f 1 以某种存储形式使自定义