安装好protobuf后,需要进行测试。
可以看这篇博客
首先,搞一个测试文件.protoc格式,会需要一个protoc 编译后生成.cc 和.h 文件。
protoc 的安装版本要高于或等于protocbuf 的版本。(我这里踩了一天的坑)
生成测试文件的命令为:
protoc -I=./protobufdemo --cpp_out=./protobufdemo ./protobufdemo/*.proto(protobufdemo自己定义的文件夹,在此文件夹的上一层目录里运行此命令)
其次,分别创建两个cpp文件,一个文件负责写,一个文件负责读。
writeprotobuf.cpp文件,向文件中写入AddressBook信息,该文件是二进制的。
#include <iostream>
#include <fstream>
#include <string>
#include "addressbook.pb.h"
using namespace std;
void PromptForAddress(tutorial::Persion *persion) {
cout << "Enter persion name:" << endl;
string name;
cin >> name;
persion->set_name(name);
int age;
cin >> age;
persion->set_age(age);
}
int main(int argc, char **argv) {
//GOOGLE_PROTOBUF_VERIFY_VERSION;
if (argc != 2) {
cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
return -1;
}
tutorial::AddressBook address_book;
{
fstream input(argv[1], ios::in | ios::binary);
if (!input) {
cout << argv[1] << ": File not found. Creating a new file." << endl;
}
else if (!address_book.ParseFromIstream(&input)) {
cerr << "Filed to parse address book." << endl;
return -1;
}
}
// Add an address
PromptForAddress(address_book.add_persion());
{
fstream output(argv[1], ios::out | ios::trunc | ios::binary);
if (!address_book.SerializeToOstream(&output)) {
cerr << "Failed to write address book." << endl;
return -1;
}
}
// Optional: Delete all global objects allocated by libprotobuf.
//google::protobuf::ShutdownProtobufLibrary();
return 0;
}
编译命令如下:
g++ /home/wg/CLionProjects/untitled/address.pb.cc writeprotobuf.cpp -o write `pkg-config --cflags --libs protobuf`
readprotobuf.cpp 的内容如下:从文件中读出AddressBook信息并打印
#include <iostream>
#include <fstream>
#include <string>
#include "addressbook.pb.h"
using namespace std;
void ListPeople(const tutorial::AddressBook& address_book) {
for (int i = 0; i < address_book.persion_size(); i++) {
const tutorial::Persion& persion = address_book.persion(i);
cout << persion.name() << " " << persion.age() << endl;
}
}
int main(int argc, char **argv) {
//GOOGLE_PROTOBUF_VERIFY_VERSION;
if (argc != 2) {
cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;
return -1;
}
tutorial::AddressBook address_book;
{
fstream input(argv[1], ios::in | ios::binary);
if (!address_book.ParseFromIstream(&input)) {
cerr << "Filed to parse address book." << endl;
return -1;
}
input.close();
}
ListPeople(address_book);
// Optional: Delete all global objects allocated by libprotobuf.
//google::protobuf::ShutdownProtobufLibrary();
return 0;
}
编译命令如下:
g++ /home/wg/CLionProjects/untitled/address.pb.cc readprotobuf.cpp -o read `pkg-config --cflags --libs protobuf`
最后测试阶段:分别开启两个终端,一个运行./ write log0
log0: File not found. Creating a new file.
Enter persion name:
wanggang
输入值进行测试。
另一个运行./read log0
读取protobuf 转换过来的信息:
wanggang 0