我刚刚开始使用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.h
、message.data
和libproto_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; }