无法使用C++平台中的协议缓冲区读回序列化数据



我刚刚开始使用protocol buffer,并尝试制作一个写回数据的最小示例。但是我没能读回序列化的数据。

我用来举例的资料

1、2、3。

我的方法

生成序列化数据的结构和代码

.
├── CMakeLists.txt
├── lib
│   └── libproto_library.so # creted after the compilation
├── proto
│   └── message.proto
├── README.md
├── run_project.sh
└── src
└── main.cpp
  • 注意事项
    • 我已经用cmake编译了这个项目。忽略了cmake文件,以免使帖子变得混乱。如果需要,我可以提供
    • 结构中未显示build文件夹。protoc complers生成的头文件驻留在那里

message.proto

syntax = "proto3";
package message;
message Sensor {
int32 humidity = 1;
}

main.cpp

#include <fstream>
#include <iostream>
#include "message.pb.h"
using namespace std;
int main(int argc, char const *argv[])
{
message::Sensor sensor;
sensor.set_humidity(68);
std::fstream ofs("../bin/message.data", std::ios_base::out | std::ios_base::binary);
sensor.SerializeToOstream(&ofs);
return 0;
}

在构建项目之后,我使用了生成的message.pb.hmessage.datalibproto_library.so

反序列化数据的结构和代码

.
├── CMakeLists.txt
├── include
│   └── message.pb.h
├── lib
│   └── libproto_library.so
├── read_back_proto.sh
└── src
├── main.cpp
└── message.data

main.cpp

#include <fstream>
#include <iostream>
#include <string>
#include "message.pb.h"
int main()
{
std::fstream ifs ("message.data", std::ios_base::out | std::ios_base::binary);
message::Sensor sensor;
sensor.ParseFromIstream(&ifs);
int32_t read_humidity = sensor.humidity();
std::cout << "humidity : " << read_humidity << std::endl;
return 0;
}

编译完这个项目后,生成的可执行文件为我提供了humidity的值为ZERO,而我预计它将为68

正在查找建议以获取正确的值。

真的陷入了一个小问题。message.data的路径错误。

  • 首先,我用std::ios_base::out打开文件。语法错误。已经在问题中编辑了
  • 可执行文件正在bin目录中执行
  • message.data位于bin的上一级,位于src目录中
  • 已更正代码以读回序列化数据:
    #include <fstream>
    #include <iostream>
    #include <string>
    #include "message.pb.h"
    int main()
    {
    std::fstream ifs ("../src/message.data", std::ios_base::in | std::ios_base::binary);
    message::Sensor sensor;
    sensor.ParseFromIstream(&ifs);
    int32_t read_humidity = sensor.humidity();
    std::cout << "humidity : " << read_humidity << std::endl;
    return 0;
    }
    

最新更新