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。

原理:

    后续会增加

小结:

慢慢学习路...

原文地址:https://www.cnblogs.com/davidyang2415/p/2505940.html