• protobuf高效传输对比json gizp等等


    https://blog.csdn.net/u013929284/article/details/72582215

    利用Protocol Buffers可以很好的解决JSON数据在传输方面的不足,它是Google公司开发的一种数据描述语言, 类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。
      protobuf文件使用一个唯一的id(数字)来代替json里复杂的key,这样只要数据发送方和数据接收方都利用同一套模板文件来解析,就可以大大提高传输效率。
      ProtoBuf.js是基于ByteBuffer.js的Protocol Buffers纯Javascript实现。主要功能是解析.proto 文件,构建message类,和简单的编码、解码。

    定义一个Protocol Buffer消息
    // 定义一个addressbook.proto
    package tutorial;

    message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;

    enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
    }

    message PhoneNumber{
    required string number = 1;
    optional PhoneType type = 2[ default = HOME];
    }

    repeated PhoneNumber phone = 4;
    }

    message AddressBook {
    repeated Person person = 1;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    细节解释
    1、package declaration为了阻止不同工程间的naming conflicts,这儿的tutorial相当于namespace。
    2、message是一个包含若干类型字段的集合,可以使用bool、int32、float、double和string类型。可以内嵌message集合,类似于struct。
    3、“1”、“2”记号标识在二进制编码中类型字段的独特Tag,表示不同的字段在序列化后的二进制数据中的布局位置。
    Tag number 1-15相对于更高的数字,少用了一个字节,所以可以使用1-15的Tag作为commonly used的repeated elements,16或者更高的Tag留给less-commonly use留给optional elements。
    4、每个字段都必须使用如下标示符

    * required:字段值必须被提供,否则消息会被认为uninitialized。
    * optional:字段值可选
    * repeated:字段也许会被重复任何次数(包括0次)。可以将repeated field看做动态大小数组。
    1
    2
    3
    5、enum是枚举类型定义的关键字,0和1表示枚举值所对应的实际整型值,和C/C++一样,可以为枚举值指定任意整型值,而无需总是从0开始定义。
    6、可以在同一个.proto文件中定义多个message,这样便可以很容易的实现嵌套消息的定义。Protocol Buffer提供了另外一个关键字import,这样我们便可以将很多通用的message定义在同一个.proto文件中,而其他消息定义文件可以通过import的方式将该文件中定义的消息包含进来,如:
    import “myproject/CommonMessages.proto”

    限定符(required/optional/repeated)的基本规则
    1、在每个消息中必须至少留有一个required类型的字段。
    2、每个消息中可以包含0个或多个optional类型的字段。
    3、repeated表示的字段可以包含0个或多个数据。
    4、如果打算在原有消息协议中添加新的字段,同时还要保证老版本的程序能够正常读取或写入,那么对于新添加的字段必须是optional或repeated。道理非常简单,老版本程序无法读取或写入新增的required限定符的字段。

    如何使用
      利用protobuf.js可以实现前后端的数据用protobuffer传输。后端通过引入npm的protobuf模块,将json数据转换成协议二进制格式,然后传到前端;前端通过XMLHttpRequest来接收数据(用jq的ajax方法会出现跨域的错误),然后引入protobuf里的dist文件夹下的protobuf.js进行解析。

    测试结果
    json json_gzip protobuf protobuf_gzip
    18.7M 1.1M 6.1M 880k
    1959ms 1551ms 1481ms 860ms
      分别使用了4种类型测试,json,gzip压缩后的json,protobuf,gzip压缩后的protobuf。
    第一行为文件大小,第二行为传输+解析花费的时间。

    应用场景
    1.需要传输大量数据的时候,例如向前台发送大数据量的顶点索引数据,传统json格式传输速度较慢,改为protobuf格式可以大大提升效率。

    参考:http://www.maxzhang.com/2015/09/ProtoBuf-js%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/
    ---------------------
    作者:Super洛伽
    来源:CSDN
    原文:https://blog.csdn.net/u013929284/article/details/72582215
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    vue 采坑 Invalid default value for prop "slideItems": Props with type Object/Array must use a factory function to return the default value.
    vue-cli3 按需引入echarts
    vue-cli3 按需引入外部elment-ui UI插件
    vue-cli3 引入less全局变量
    css 文本溢出截断省略方案
    canvas画圆角头像
    css 加载效果
    css实例气泡效果
    css居中-水平居中,垂直居中,上下左右居中
    meta标签
  • 原文地址:https://www.cnblogs.com/xiaohanlin/p/10336988.html
Copyright © 2020-2023  润新知