• Google Protocol Buffer学习笔记(一)


    概述:

        新公司用的平台和相关技术都与原公司使用的不同,原来是linux+thrift而现在换成了windows+protobuf了。

        参考资料:

    https://developers.google.com/protocol-buffers/docs/proto?hl=zh-CN

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/

    要点:

    是什么:

        Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

        以上是从网络上摘抄的定义。相同类别的东西有xml,josn,thirft。其中thrift更加相似。

    怎么用:

        首先,需要定义.proto文件--即定义要交换的数据结构;

        其次,编译.proto文件--用网络上下载的编译器程序编译.proto文件,

                根据编译选项会生成相应的文件(C++为.h/.cc文件);

        最后,将编译生成的文件代码加入到项目中。

        PS:使用protobuf既可以只定义协议数据格式也可以生成RPC接口。

    .proto文件:

    --数据格式:

        数据结构体:message message_name{message_body;}

        message_body格式:例如required int32 query=1[defaut=10];

           形式为:rule type name=value[other_rule];

    --规则:

        规则有三个:

             required表示必须具有该值域;

             optional表示可选的值域;

             repeated表示可重复的值域(即>=0);

        其中requered/optional是常用rule,而repeated则不常用同时因为是历史

            遗留现使用repeated int32 samples=4[packed=true];形式;

    --value值:

        value值最小为1,是底层编码时使用其中1-15占一位,>15则会占多位;

        不同的message中的value值互不干扰,常以1开始计数。

    --数据类型之基本类型:

    .proto Type C++ Type Java Type
    double double double
    float float float
    int32 int32 int
    int64 int64 long
    uint32 uint32 int
    uint64 uint64 long
    sint32 int32 int
    sint64 int64 long
    fixed32 uint32 int
    fixed64 uint64 long
    sfixed32 int32 int
    sfixed64 int64 long
    bool bool boolean
    string string String
    bytes string ByteString

    --数据类型之复杂类型:

        复杂类型主要包括:枚举,其他message,groups等。

        枚举定义例如:enum Corpus{WEB=0;LOCAL=1}

           枚举定义在message中。

        可以使用其他message作为类型来定义成员。

        groups我的理解有些像C++中的union结构。

    --嵌套定义:

        可以嵌套定义message结构,而嵌套定义的message被其他message作为

            成员类型时需要形式为outmessage.inmessage形式。

    --包结构:

        定义形式:package foo.bar;

        对应C++中则生成两个命名空间foo和bar,且bar定义在foo中;

        可以通过import "myproject/other_protos.proto";来引入.proto文件;

        引用其他package中message时需要完整的package路径;

    --Services:

        主要用于RPC系统中,在.proto中定义接口;

        定义形式如例子:

    service SearchService{

        rpc Search(SearchRequest) return (SearchResponse);

    }

    .proto文件编译:

      格式:

    protoc –proto_path=IMPORT_PATH –cpp_out=DIST_DIR path/file.proto

    其中可根据需要更改—cpp_out选项为java_out/python_out。

    原理:

        后续会增加

    小结:

    慢慢学习路...

  • 相关阅读:
    蓝牙4.0BLE抓包(二) – 广播包解析
    蓝牙4.0BLE抓包(一)
    蓝牙4.0 BLE 广播包解析
    蓝牙学习笔记之实例广播数据的解析
    Android ConstraintLayout详解
    Android ConstraintLayout的基本使用
    使用EasyBCD完美实现Windows7与Linux双系统
    使用MbrFix.exe修复MBR分区表
    C#中的Delegate
    C# 设置程序开机自动运行(+注册表项)
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/2505940.html
Copyright © 2020-2023  润新知