proto文件简介
每个元素上的“= 1”,“= 2”标记标识该字段在二进制编码中使用的唯一“标记”
每个字段有三个可选修饰符
- required:必须提供字段的值,否则消息将被视为“未初始化”。
- optional:字段可以设置也可以不设置。如果未设置可选字段值,则使用默认值。对于简单类型,您可以指定自己的默认值,就像我们对示例中的电话号码类型所做的那样。否则,将使用系统缺省值:数字类型为零,字符串为空字符串,bools为false。
- repeated:相当于std的vector,可以用来存放N个相同类型的内容
package tutorial;
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 phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
Compiling Your Protocol Buffers
下载编译器
注意:
1.proto文件路径要有文件名,而–cpp_out路径不能有文件名,只能是路径 protoc xxxx.proto --cpp_out=.
2.最好是cd到proto文件所在的目录再导出,否则会出现生成出来的文件找不到头文件的问题
protobuf生成C++代码时会在同一个目录下生成两个文件,一个.cc一个.h,生成的.cpp文件会include生成的.h文件,而如果不cd到proto文件所在目录去操作,那就可能会出现.cc文件包含.h文件时路径错误
例如:.proto文件在src目录下,导出代码也导出到src目录下,可能执行如下命令 protoc src/xxxx.proto --cpp_out=.
因为你想要C ++类,所以使用–cpp_out选项 - 为其他支持的语言提供类似的选项。
=>得到 pb.h 和pb.cc文件
1.在.h文件中,可以看到
getter的名称是小写的字段,setter方法以set_开头。每个单数(必需或可选)字段还有has_方法,如果该字段已设置,则返回true。最后,每个字段都有一个clear_方法,将字段取消设置为其空状态。
2.字符串字段
调用mutable_email();它将被自动初始化为一个空字符串。inline ::std::string* mutable_email();
3.repeated字段
- 检查重复元素的_size
- 获取index指定位置的元素
- 更新索引的元素
- 向消息中添加另一个元素,然后可以对其进行编辑(重复的标量类型具有add_,只是允许您传递新值)。
4.一些有用的函数
- bool IsInitialized()const ;:检查是否所有必填字段都已设置。
- string DebugString()const ;:返回一个人类可读的消息表示,特o别适用于调试。
- void CopyFrom(const Person&from);:用给定消息的值覆盖消息。
- void Clear();:将所有元素清除回空状态。
重头戏:Parsing and Serialization
bool SerializeToString(string * output)const ;:序列化消息并将字节存储在给定的字符串中。 注意字节是二进制的,而不是文本; 我们只用String类作为一种方便的容器。
bool ParseFromString(const string&data);:解析来自给定字符串的消息。
bool SerializeToOstream(ostream * output)const ;:将消息写入给定的C ++ ostream。
bool ParseFromIstream(istream * input);:解析来自给定C ++ istream的消息。
这些只是为解析和序列化提供的几个选项。 再次,有关完整列表,请参阅Message API参考。
//C++string序列化和序列化API
bool SerializeToString(string* output) const;
bool ParseFromString(const string& data);
//使用:
void set_people()
{
wp.set_name("sealyao");
wp.set_id(123456);
wp.set_email("[email protected]");
wp.SerializeToString(&pstring);
}
void get_people()
{
rsp.ParseFromString(pstring);
cout << "Get People from String:" << endl;
cout << "\t Name : " <<rsp.name() << endl;
cout << "\t Id : " << rsp.id() << endl;
cout << "\t email : " << rsp.email() << endl;
}