參考資訊:
https://github.com/afiskon/cpp-protobuf-example/tree/master
https://stackoverflow.com/questions/47704968/protoc-command-not-found-linux
https://stackoverflow.com/questions/62707863/how-to-encode-messages-with-map-using-google-protobuf-in-javascript-protocol
main.proto
syntax = "proto3";
package mytest.Test;
message Who {
string name = 1;
int64 value = 2;
map<string, string> items = 3;
}
main.cpp
#include <iostream>
#include <fstream>
#include <stdexcept>
#include "main.pb.h"
using namespace std;
using namespace mytest::Test;
int main(int argc, char **argv)
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
Who t1;
t1.set_name("t1");
t1.set_value(100);
(*t1.mutable_items())["1"] = "egg";
(*t1.mutable_items())["2"] = "apple";
fstream out("t1.dat", ios::out | ios::trunc | ios::binary);
t1.SerializeToOstream(&out);
out.close();
Who t2;
fstream in("t1.dat", ios::in | ios::binary);
t2.ParseFromIstream(&in);
in.close();
cout << "t2.name: " << t2.name() << endl;
cout << "t2.value: " << t2.value() << endl;
cout << "t2.items_size: " << t2.mutable_items()->size() << endl;
google::protobuf::Map t2_items = *t2.mutable_items();
for (google::protobuf::Map<string, string>::const_iterator it = t2_items.begin(); it != t2_items.end(); it++) {
cout << "[" << it->first << "] = " << it->second << endl;
}
return 0;
}
編譯、執行
$ protoc --cpp_out . main.proto
$ g++ main.cpp -o test main.pb.cc -I. -lprotobuf
$ ./test
t2.name: t1
t2.value: 100
t2.items_size: 2
[2] = apple
[1] = egg