重复数据类型

protobuf语言的重复字段类型相当于C++的std::list数据类型

工程目录结构

$ ls proto/
TServer.proto TSession.proto

proto文件

$ cat TSession.proto
syntax = "proto3"; //枚举类型可以放外面,也可以放message里面
enum Status
{
INVALID = 0;
VALID = 1;
}; message TSession
{
string owner = 1;
Status status = 2;
}; $ cat TServer.proto
syntax = "proto3"; import "TSession.proto"; //通过repeated来模拟链表的可变长度
message TServer
{
repeated TSession sessions = 1;
};

读写源文件

$ cat writer.cpp
#include <fstream>
#include <iostream>
#include <string>
#include "TServer.pb.h" using namespace std; int main(int argc, char *argv[])
{
TServer srv;
std::string owner;
while(true)
{
std::getline(std::cin, owner);
if (owner.empty())
break;
//自动生成一个新的节点,并返回对象指针
TSession* s = srv.add_sessions();
s->set_owner(owner);
s->set_status(Status::VALID);
} fstream output("./log", ios::out | ios::trunc | ios::binary);
cout << "Serialize start." << endl;
if (!srv.SerializeToOstream(&output))
{
cout << "Serialize failed." << endl;
return -1;
}
output.close();
cout << "Serialize end." << endl;
return 0;
} $ cat reader.cpp
#include <fstream>
#include <iostream>
#include "TServer.pb.h" using namespace std; int main(int argc, char *argv[])
{
fstream input("./log", ios::in | ios::binary);
cout << "Deserialize start." << endl; TServer srv;
if (!srv.ParseFromIstream(&input))
{
cout << "Deserialize failed." << endl;
return -1;
}
cout << "First Method" << endl;
for (int i = 0; i < srv.sessions_size(); i++)
srv.sessions(i).PrintDebugString(); cout << "Second Method" << endl;
auto sessions = srv.sessions();
for (auto iter = sessions.begin(); iter != sessions.end(); iter++)
iter->PrintDebugString(); cout << "Deserialize end." << endl;
input.close();
return 0;
}
05-22 17:08