Proto文件:
package lm;
message helloworld
{
required int32 id = 1;
required string str = 2;
message Url {
required string word = 1;
optional string id = 2;
}
required Url url = 3;
optional int32 opt = 4;
}
Write:
#include "helloworld.pb.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
using namespace lm;
int main(void)
{
lm::helloworld msg1;
msg1.set_id(101);
msg1.set_str("hello");
lm::helloworld_Url *pUrl = msg1.mutable_url();
pUrl->set_word("world");
string test;
msg1.SerializeToString(&test);
cout<<"Serialized size="<< test.length() << ",content=" << test << endl;
cout << "------------------------" << endl;
// write the new address book back to disk.
fstream output("./log", ios::out | ios::trunc | ios::binary);
if (!msg1.SerializeToOstream(&output))
{
cerr<<"Failed to write msg."<<endl;
return -1;
}
lm::helloworld msg;
msg.ParseFromString(test);
cout<<"Id:"<<msg.id()<<endl;
cout<<"Str:"<<msg.str()<<endl;
return 0;
}
Read:
#include<iostream>
#include<fstream>
#include "helloworld.pb.h"
using namespace std;
int main(void)
{
lm::helloworld msg;
fstream input("./log", ios::in | ios::binary);
if(!input)
{
cout << "log file not found." << endl;
}
else if(!msg.ParseFromIstream(&input))
{
cerr << "Failed to parse helloworld." << endl;
return -1;
}
cout << "id:" << msg.id() << endl;
cout << "str:" << msg.str() << endl;
lm::helloworld_Url theUrl = msg.url();
cout << "word: " << theUrl.word() << endl;
google::protobuf::ShutdownProtobufLibrary();
return 0;
}