zoukankan      html  css  js  c++  java
  • Protobuf简介

    简明扼要的说,protobuf是一种对结构化数据的序列化格式(形如JSON、XML),用于在数据通信、数据存储之中。protobuf是由Google设计开发,与开发平台及开发语言均无关。其特点在于灵活高效,序列化后的数据简单、轻便,序列化/反序列化过程耗时更短。

    在使用Protobuf时,需要将待序列化的结构类型在“.proto“文件中进行标注声明。一个protocol buffer消息,包含有若干个key-value对。在一个消息内,每一个字段都包含有它的名字和它的数据类型。数据类型可以是数字、布尔型、字符串、比特串,甚至是其他的protocol buffer消息类型。对声明的消息字段,可以特别的声明该字段是可选字段(optional)还是必填字段(required)还是可重复字段(repeated)。以下是一个.proto文件的样例:

    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;
    }
    

    在你已经定义好消息格式后,便可运行protocol buffer的编译器,将.proto文件编译成项目中可被访问的实体类了。在生成的实体类中,包含有对字段的控制方法(getter,setter),也包含有序列化/反序列化的方法。你可以在消息格式中添加新的字段,而不会导致破坏向后兼容性,老的数据流在进行反序列化时,会忽略新添加的字段。

    每一个在消息定义中的字段都有一个唯一的数字标签,这个数字标签(tag)是用于标记在数字二进制编码形式下,该实体类字段所在的位置。需要注意的一点是,当tag的取值范围在[1,15]时,将会把数字标识和字段类型封装在一个字节内,如果tag的取值范围在[16,2047]范围内,将会封装在两个字节内。tag的最小取值为1,最大的取值为(2^{29}-1),但值得注意的是不能使用[19000,19999]内的数字,因为这些是由protocol内部使用。

  • 相关阅读:
    滤波和减采样的互换
    LwIP情景示例
    [redis] redis 对string类型数据操作
    [ExtJs] ExtJs4.2 数据模型Ext.data.Model学习
    [生活] 90年前后出生的人现状如何?
    【java】java内存模型(2)--volatile内存语义详解
    【java】java内存模型 (1)--基础
    [extjs] ExtJS 4.2 开发环境搭建
    强烈推荐:240多个jQuery插件
    使用CXF为webservice添加拦截器
  • 原文地址:https://www.cnblogs.com/gscienty/p/7542653.html
Copyright © 2011-2022 走看看