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 Change
set_-eid()
set_-id()
。而且,指针
phone
addr
coll
未初始化且未指向内存中的有效类型。使用这些指针会导致错误。非常感谢您提供示例代码。这有助于更好地理解protobuf函数。