zoukankan      html  css  js  c++  java
  • ProtocolBuffers-3 For Objective C (2)-进阶

    先介绍几个常用关键字:

    equired前缀表示该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值。与此同时,在Protocol Buffer中还存在另外两个类似的关键字,optional和repeated,带有这两种限定符的消息字段则没有required字段这样的限制。相比于optional,repeated主要用于表示数组字段

    标签数字123则表示不同的字段在序列化后的二进制数据中的布局位置

    对于Protocol Buffer而言,标签值为1到15的字段在编码时可以得到优化,即标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,而Protocol Buffer可以支持的字段数量则为2的29次方减一。有鉴于此,我们在设计消息结构时,可以尽可能考虑让repeated类型的字段标签位于1到15之间,这样便可以有效的节省编码后的字节数量

    Extentions

    extensions 声明一个消息中的一定范围的field的顺序数字用于进行扩展。其它人可以在自己的.proto文件中重新定义这些消息field,而不需要去修改原始的.proto文件

    message Foo {

      // .....

      extensions 100 to 199;

    }

    这些说明100-199的field是保留的。其它用户可以用这些field在他们自己的.proto文件中添加新的fields给Foo。举例:

    extend Foo {

      optional int32 bar = 126;

    }

    非常重要的一点是双方不能使用同样数字添加一样的message类型,这样extension会被解释为错误类型。

    可能需要有一个关于field的数字顺序的约定来保证你的project不会发生这样的重复的问题。

    如果你的field数字比较大的话,可以使用max来指定你的textension范围上升到最大的范围

    message Foo {

      extensions 1000 to max;

    }

    没有指定默认值的话,string 默认为空串,bool 默认为false,数字类型默认0,枚举类型,默认为类型定义中的第一个值

    1. proto文件基础写法

    syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

    message Person { // message类似class
    string name = 1; // 1 表示这个字段存储的位置
    int32 id = 2; // 字段格式:限定符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]
    string email = 3;
    bytes image = 4; // 定义nsndata
    bool isHave = 5;
    map<string, string> projects = 6; // 定义字典
    repeated string array = 7; // 定义数组
    float numFool = 8;
    double numDouble = 9;

    }
    // 限定符: singular,repeated
    //singular:一个正确定义的消息包含零或者1个该field.不超过1个
    //repeated:可以添加多个,相当于一个数组.排列顺序就是添加时的顺序.protobuf3对scalar数字类型的repeated限定默认都是packed的,这样可以节省很多空间,共用一个key,减少了key的占用.

    // 在当前目录便可以看到Test.pbobjc.h和Test.pbobjc.m这两个文件了(需要注意的是生成的代码是MRC的,如果引入ARC工程中记得添加-fno-objc-arc的标签).

    2.

    syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

    message Person {
    string name = 1;
    int32 id = 2;
    PhoneNumber pp = 3; // // 可以嵌套
    PhoneType type = 5; // 可以使用枚举
    repeated PhoneNumber phone = 4; //
    }

    message PhoneNumber {
    string number = 1;
    PhoneType type = 2 ;
    }

    enum PhoneType {
    //enum类型必须有一个明确是0的字段,这个一是为了和protobuf2兼容,而是使其有个默认值
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
    }

    3.

    syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

    import "google/protobuf/any.proto";

    message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    repeated google.protobuf.Any details = 5; // any任何类型

    }

    enum EnumAllowingAlias {
    option allow_alias = true; // 如果想让不同的枚举指向同一个field
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 1;
    }

  • 相关阅读:
    为什么要使用href=”javascript:void(0);”
    29zTree
    js获取下拉框的值
    C# 判断文件夹与文件是否存在
    C# 判断文件和文件夹是否存在并创建
    ASP.NET实现excel导入数据库
    同时向主表和从表里面导入execl数据 (asp.net webform)
    EasyUI数据分页实现(真假分页)
    easyui datagrid 前台分页的实现java采用的版本
    异步和多线程
  • 原文地址:https://www.cnblogs.com/mcj-coding/p/6228782.html
Copyright © 2011-2022 走看看