美文网首页
Proto学习记录

Proto学习记录

作者: 欧德朗 | 来源:发表于2019-01-15 18:28 被阅读0次

2019-01-15
参考网址 1
参考网址 2 这个参考网址2 写的不咋地,写的有错误,作为键盘侠的我要。。。。算了算了 划水划水
大佬大佬惹不起惹不起

先行介绍这个玩意的由来?

Proto介绍:

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

  • 以上抄自参考网址 1
  • 下面开始安装和使用教程:
    安装:

protoc --version #查看当前系统的proto版本?

如果没有

sudo apt-get install protobuf-compiler

安装就完了,盘它

想用proto 就得先写一个proto的文件

下面简单的介绍一下proto文件的大致组成:
proto 的编写:
syntax="proto2"; #这个proto后面可以用2 或者 3 取决于你安装的proto编译器的版本
option java_package = "org.serialization.protobuf.quickstart";   #这个也可以是没有`java_`的,java编译的时候用`java_`,c++编译的时候直接用package ,python的没看到但是我猜应该是python_package 指定报名字,就像给别的java 文件import的那个东西
option java_outer_classname = "PersonProtobuf";   #class 取了个别名 
message Person  #message  整个文件的主体
{   
  optional  int32 age = 1;#age这种东西叫做成员   optional修饰词  说明这个成员在消息传递时时可选项,可以有可以没有
  required   string name = 2; #name这种东西也是成员  required 修饰词 是必须项  
}

proto的编译 :

protoc  --cpp_out=./ ./Person.proto
protoc  --java_out=./ ./Person.proto
protoc  --python_out=./ ./Person.proto

俩参数 一个指定编译方式同时指定了输出路径 , 第二个参数指定proto的文件
因为 支持三种语言的 api分别就是c++ java & python三种 Java编出来是一个文件夹下面好几层有一个后缀java的文件
c++编出来的 是一个 后缀pb.h 和一个pb.cc文件 h声明cc实现
python 编出来的还是后缀py

以上这个几种语言说的是版本2涉及到的语言,版本3支持的语言超级多

然后接下来是对这个message的读写,网址一说用c++ 行吧那就用c++的

为什么我点的黄焖鸡还没有送到?已经2019年1月15日12:15:57了
woc 终于发生了像王克一样的事情,定个外卖都被取消了2019-1-15 12:22:14
行吧 行吧 出去吃 去吃个炒面吧
  • 接下来就是这个message的读写:
    用pb.h中的类实例化一个对象 ,然后 就用这个对象去调用set_idset_name的方法对这个对象进行操作。这是我在12:28:32理解,准备去吃午饭, 等会回来再看吧

上面的不重要了,了解一个proto文件中写enmu模具成员的目的:
大佬大佬那个网址往下拉,就能看的见
引用大佬原话:

当需要定义一个消息类型的时候,可能想为一个字段指定某“预定义值序列”中的一个值。
例如,假设要为每一个VrGetPhoneBook 消息添加一个 phonebookType 字段,而phonebookType 的值可能是phonebookType_contact ,phonebookType_incomingcall ,phonebookType_outgoingcall ,phonebookType_missedcall ,phonebookType_wholecall 中的一个。 其实可以很容易地实现这一点:通过向消息定义中添加一个枚举(enum)并且为每个可能的值定义一个常量就可以了。

syntax = "proto2";
package navi.VoiceRecog;

option java_package = "com.iauto.voice";
option optimize_for = LITE_RUNTIME;
option java_outer_classname="VrGetPhoneBookJ";

message VrGetPhoneBook {

    enum phonebookType {
        phonebookType_contact          = 0;
        phonebookType_incomingcall = 1;
        phonebookType_outgoingcall  = 2;
        phonebookType_missedcall     = 3;
        phonebookType_wholecall       = 4;
    };

    required phonebookType type = 1;
};

大概意思是这样的,那现在看看,message的读写

相关文章

网友评论

      本文标题:Proto学习记录

      本文链接:https://www.haomeiwen.com/subject/qfnedqtx.html