ProtoBuf练习(五)
表类型
protobuf语言的maps字段类型相当于C++语言的std::map类型
工程目录结构
$ ls proto/
sample_maps.proto
proto文件
$ cat proto/sample_maps.proto
syntax = "proto3";
message home
{
string addr = 1;
}
message sample_maps
{
map<int32, string> ids = 1;
map<string, home> infos = 2;
}
读写源文件
$ cat reader.cpp
#include <fstream>
#include <iostream>
#include "sample_maps.pb.h"
using namespace std;
int main(int argc, char *argv[])
{
fstream input("./log", ios::in | ios::binary);
cout << "Deserialize start." << endl;
sample_maps m;
if (!m.ParseFromIstream(&input))
{
cout << "Deserialize failed." << endl;
return -1;
}
auto ids = m.ids();
for (auto iter = ids.cbegin(); iter != ids.cend(); iter++)
cout << iter->first << " : " << iter->second << endl;
auto infos = m.infos();
for (auto iter = infos.cbegin(); iter != infos.cend(); iter++)
cout << iter->first << " : " << iter->second.DebugString();
cout << "Deserialize end." << endl;
input.close();
return 0;
}
$ cat writer.cpp
#include <fstream>
#include <iostream>
#include "sample_maps.pb.h"
using namespace std;
int main(int argc, char *argv[])
{
sample_maps m;
auto ids_ptr = m.mutable_ids();
(*ids_ptr)[1] = "fwd";
(*ids_ptr)[2] = "xb";
auto infos_ptr = m.mutable_infos();
home h;
h.set_addr("nj");
(*infos_ptr)["fwd"] = h;
fstream output("./log", ios::out | ios::trunc | ios::binary);
cout << "Serialize start." << endl;
if (!m.SerializeToOstream(&output))
{
cout << "Serialize failed." << endl;
return -1;
}
output.close();
cout << "Serialize end." << endl;
return 0;
}