C++ C++;protobuf如何为嵌套结构设置值 设置电话类型(学生电话类型); s、 可变电话()->设置电话号码(“+00 123 1234567”); s、 可变地址()->设置地址1(“房屋1,街道1”); s、 可变地址()->设置地址2(“房屋2,街道2”); s、 可变大学()->设置大学名称(“XYZ大学”); s、 可变大学地址()->设置大学地址(“此处的大学地址”); std::cout Changeset_-eid()set_-id()。而且,指针phone、addr和coll未初始化且未指向内存中的有效类型。使用这些指针会导致错误。非常感谢您提供示例代码。这有助于更好地理解protobuf函数。
我需要序列化以下结构:C++ C++;protobuf如何为嵌套结构设置值 设置电话类型(学生电话类型); s、 可变电话()->设置电话号码(“+00 123 1234567”); s、 可变地址()->设置地址1(“房屋1,街道1”); s、 可变地址()->设置地址2(“房屋2,街道2”); s、 可变大学()->设置大学名称(“XYZ大学”); s、 可变大学地址()->设置大学地址(“此处的大学地址”); std::cout Changeset_-eid()set_-id()。而且,指针phone、addr和coll未初始化且未指向内存中的有效类型。使用这些指针会导致错误。非常感谢您提供示例代码。这有助于更好地理解protobuf函数。,c++,serialization,deserialization,protocol-buffers,binary-serialization,C++,Serialization,Deserialization,Protocol Buffers,Binary Serialization,我需要序列化以下结构: enum phonetype { DESKPHONE, MOBILE, WIRELESSPHONE }; struct phonenumber { int ptype; string number; }; struct address { string addr1; string addr2; }; struct college { string collegename; string coll
enum phonetype
{
DESKPHONE,
MOBILE,
WIRELESSPHONE
};
struct phonenumber
{
int ptype;
string number;
};
struct address
{
string addr1;
string addr2;
};
struct college
{
string collegename;
string collegeaddress;
};
struct student
{
int id;
string name;
double age;
string email;
struct phonenumber phoneN;
struct address addr;
struct college col;
};
我已按如下方式初始化结构:
student stud = {123, "Stud_1", 30, "none",
{MOBILE, "123456789"},
{"Boston, US", "None"},
{"Boston college", "Boston"}};
studentP studObj;
studObj.set_name(stud.name);
studObj.set_eid(stud.id);
studObj.set_age(stud.age);
studentP::phonenumberP *phone;
phone->set_ptype(stud.phoneN.ptype);
phone->set_number(stud.phoneN.number);
studentP::addressP *addr;
addr->set_addr1(stud.addr.addr1);
addr->set_addr2(stud.addr.addr2);
studentP::collegeP *coll;
coll->set_collegename(stud.col.collegename);
coll->set_collegeaddress(stud.col.collegeaddress);
string student_str;
studObj.SerializeToString(&student_str);
现在,我想创建此结构的序列化字符串,我已经为其编写了以下.proto
文件:
syntax = "proto2";
message studentP
{
required int32 id = 1;
required string name = 2;
required double age = 3;
optional string email = 4;
message phonenumberP
{
required int32 ptype = 1;
required string number = 2;
}
message addressP {
required string addr1 = 1;
optional string addr2 = 2;
}
message collegeP {
required string collegename = 1;
optional string collegeaddress = 2;
}
}
在我的C++代码中,我设置了原始Objo值如下:
student stud = {123, "Stud_1", 30, "none",
{MOBILE, "123456789"},
{"Boston, US", "None"},
{"Boston college", "Boston"}};
studentP studObj;
studObj.set_name(stud.name);
studObj.set_eid(stud.id);
studObj.set_age(stud.age);
studentP::phonenumberP *phone;
phone->set_ptype(stud.phoneN.ptype);
phone->set_number(stud.phoneN.number);
studentP::addressP *addr;
addr->set_addr1(stud.addr.addr1);
addr->set_addr2(stud.addr.addr2);
studentP::collegeP *coll;
coll->set_collegename(stud.col.collegename);
coll->set_collegeaddress(stud.col.collegeaddress);
string student_str;
studObj.SerializeToString(&student_str);
上面我分别为类studentP
的内部结构设置了值
如何设置studentP
对象studObj
的内部结构值?
我是否需要为每个内部结构调用
SerializeToString
?到目前为止,ProtoBuf模式只包含嵌套消息(电话、地址和学院)的定义;但是,在学生
消息类型中,不是它们各自的字段。而且,代码中不需要有单独的结构。它们已经在protoc
生成的.pb.h
和.pb.cc
文件中声明和定义。用那些。否则,在使用序列化/反序列化库/框架的同时在代码中手动维护这些类型会弄巧成拙,除非您有很好的理由这样做
更新后的ProtoBuf模式将是(注意下面的字段5、6和7):
studentinfo.proto
syntax=“proto2”;
包装试验;
信息学生
{
所需的int32 id=1;
所需字符串名称=2;
所需双倍年龄=3岁;
可选字符串email=4;
枚举电话类型
{
桌面=1;
流动电话=2;
无线=3;
};
短信电话
{
所需电话类型=1;
所需字符串编号=2;
}
消息地址{
所需字符串地址1=1;
可选字符串地址2=2;
}
信息学院{
所需字符串名称=1;
可选字符串地址=2;
}
所需电话=5;
所需地址=6;
选修学院=7所;
}
一旦您有了所需的模式和生成的文件,您就可以继续创建和填充类型,然后序列化要通过线路发送的消息,并在另一端进行反序列化
下面是一个完整的工作示例:
main.cpp
#包括
#包括
#包括“studentinfo.pb.h”
int main()
{
使用名称空间测试;
//系列化
学生证;
s、 设置名称(“测试”);
s、 set_id(123);
s、 设定年龄(24岁);
s、 可变电话()->设置电话类型(学生电话类型);
s、 可变电话()->设置电话号码(“+00 123 1234567”);
s、 可变地址()->设置地址1(“房屋1,街道1”);
s、 可变地址()->设置地址2(“房屋2,街道2”);
s、 可变大学()->设置大学名称(“XYZ大学”);
s、 可变大学地址()->设置大学地址(“此处的大学地址”);
std::cout Changeset_-eid()
set_-id()
。而且,指针phone
、addr
和coll
未初始化且未指向内存中的有效类型。使用这些指针会导致错误。非常感谢您提供示例代码。这有助于更好地理解protobuf函数。