嵌套结构的字段值未在protobuf中设置

时间:2017-07-21 00:44:02

标签: c++ protocol-buffers

我使用谷歌protobuffer进行数据反序列化,但我的问题是嵌套结构的字段值没有设置。我在十六进制编辑器中检查了bin文件,值看起来很好。但是,由于我的嵌套结构中的第一个字段是浮点数,如果我尝试获取相应的字节数并将其解码为浮点数,则该值似乎很好。

有人可以建议我还能做些什么来检查这个或者可能发生了什么?我也尝试过使用ParseFromIstream。

原型文件是:

   syntax = "proto3";
   package generatedata;

   message DataSample {
   DataSample_Safe DataSafe = 1;
   uint32 PassReSts = 2;
   uint32 Dir = 3;    
   }


   message DataSample_Safe {
      float ALast = 1;
      uint32 ALastQf = 2;   
    } 

    message DataSampleMultiple
    {
       repeated DataSample finaldata = 1;
    }

C ++代码是

fstream in("test.bin", ios::in | ios::binary);

generatedata::DataSample test_data;   


while(in.read((char *) &test_data,sizeof(test_data)))
{
    const generatedata::DataSample_Safe& veh = test_data.datasafe();
    cout << "safe" << veh.alast() << endl;

    cout << "First " << test_data.passrests() << endl;
    cout << "Second " << test_data.dir() << endl;

}

使用ParseFromIstream,代码是

generatedata::DataSampleMultiple test_data;
test_data.ParseFromIstream(&in);

for(int i = 0 ; i < test_data.finaldata_size(); i ++)
{
     const generatedata::DataSample& veh = test_data.finaldata(i);
     const generatedata::DataSample_Safe& check = veh.datasafe();
     cout << "safe" <<  check.alast() << endl;

     cout << "First " << veh.passrests() << endl;
     cout << "Second " << veh.dir() << endl;
}

在上述情况下使用ParseFromIstream,最终数据大小为0

第一个cout给出了分段错误,因为尚未设置safe的值。但是,使用istream :: read

时,第二个和第三个cout正确输出

0 个答案:

没有答案