• 使用protobuf做数据交换


    使用protobuf做数据交换

    在以不同语言编写并在不同平台上运行的应用程序之间交换数据时,Protobuf 编码可提高效率。
    -- Marty Kalin(作者)

    协议缓冲区(Protocol Buffers)(Protobufs)像 XML 和 JSON 一样,可以让用不同语言编写并在不同平台上运行的应用程序交换数据。例如,用 Go 编写的发送程序可以在 Protobuf 中对以 Go 表示的销售订单数据进行编码,然后用 Java 编写的接收方可以对它进行解码,以获取所接收订单数据的 Java 表示方式。这是在网络连接上的结构示意图:

    Go 销售订单 —> Pbuf 编码 —> 网络 —> Pbuf 界面 —> Java 销售订单

    与 XML 和 JSON 相比,Protobuf 编码是二进制而不是文本,这会使调试复杂化。但是,正如本文中的代码示例所确认的那样,Protobuf 编码在大小上比 XML 或 JSON 编码要有效得多

    Protobuf 以另一种方式提供了这种有效性。在实现级别,Protobuf 和其他编码系统对结构化数据进行 序列化(serialize)和 反序列化(deserialize)。序列化将特定语言的数据结构转换为字节流反序列化是将字节流转换回特定语言的数据结构的逆运算序列化和反序列化可能成为数据交换的瓶颈,因为这些操作会占用大量 CPU。高效的序列化和反序列化是 Protobuf 的另一个设计目标

    Protobuf 在数据交换中为 IDL(接口定义语言)和编码层做出了贡献。

    Protobuf 作为一个 IDL 和编码层

    Protobuf 可用于现代 RPC 系统。

    目前,XML 和 JSON 编码仍在通过 Web 服务等技术进行的数据交换中占主导地位,这些技术利用 Web 服务器、传输协议(例如 TCP、HTTP)以及标准库和实用程序等原有的基础设施来处理 XML 和 JSON 文档。 此外,各种类型的数据库系统可以存储 XML 和 JSON 文档,甚至旧式关系型系统也可以轻松生成查询结果的 XML 编码。现在,每种通用编程语言都具有支持 XML 和 JSON 的库。

    那么,是什么让我们回到 Protobuf 之类的二进制编码系统呢?

    文本编码的压缩性明显低于二进制编码

    Protobuf 编码大约是 JSON 的四分之一,是 XML 的五分之一。但是原始数据清楚地表明 Protobuf 也会产生编码开销:序列化的 Protobuf 消息比原始数据大 11MB。包括 Protobuf 在内的任何编码都涉及结构化数据,这不可避免地会增加字节。

    ProtoBuf 的不足

    Protobuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。 由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。另外,由于 XML 具有某种程度上的自解释性,它可以被人直接读取编辑,在这一点上Protobuf 不行,它以二进制的方式存储,除非你有 .proto 定义,否则你没法直接读出 Protobuf 的任何内容。

  • 相关阅读:
    cas改造随笔
    数字证书KeyTool使用(第二篇)
    debug.keystore文件不存在解决办法
    SSL安全解决方案(转)
    CAS SSO:汇集配置过程中的错误解决方法
    sso笔记
    获取指定月 获取指定日期是星期几
    协同过滤推荐算法总结
    Java动态代理深入解析
    分享一个前后端分离的轻量级内容管理框架
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/15090163.html
Copyright © 2020-2023  润新知