安装
更新系统软件包列表
sudo apt update
安装 Protocol Buffers 编译器和运行时库
sudo apt install protobuf-compiler
注:常见问题:缺少依赖
User
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
protobuf-compiler : Depends: libprotoc9v5 (= 2.6.1-1.3) but it is not going to be installed
sogoupinyin : Depends: libqtwebkit4 but it is not going to be installed
Depends: fonts-droid but it is not installable or
fonts-droid-fallback but it is not going to be installed
Depends: libopencc2 but it is not installable or
libopencc1 but it is not going to be installed
运行以下命令来修复这些未满足的依赖项:
sudo apt-get -f install
解决依赖问题后重新安装即可
sudo apt install protobuf-compiler
显示版本
protoc --version
使用
person.proto
syntax = "proto2";
message Person {
required string name = 1;
required int32 age = 2;
optional Gender gender = 3;
optional Address address = 4;
}
message Address {
required string street = 1;
optional string city = 2;
optional string province = 3;
required string country = 4;
}
enum Gender {
UNKNOWN = 0;
MALE = 1;
FEMALE = 2;
}
生成.cc
protoc -I=. --cpp_out=. person.proto
ls
main.cpp person.pb.cc person.pb.h person.proto
test: main,cpp
#include <iostream>
#include <string>
#include "person.pb.h" // Protocol Buffers 自动生成的头文件
struct AddressData {
std::string country;
std::string province;
std::string city;
std::string street;
};
struct PersonData {
std::string name;
int age;
int gender; // 使用整数值表示性别
AddressData address;
};
// 使用 Protocol Buffers 对象进行数据的序列化
std::string SerializePerson(const PersonData& data) {
Person person; // 使用生成的消息类
person.set_name(data.name);
person.set_age(data.age);
person.set_gender(static_cast<Gender>(data.gender));
Address* address = person.mutable_address();
address->set_country(data.address.country);
address->set_province(data.address.province);
address->set_city(data.address.city);
address->set_street(data.address.street);
std::string serialized_data;
if (!person.SerializeToString(&serialized_data)) {
std::cerr << "Failed to serialize person." << std::endl;
return "";
}
return serialized_data;
}
// 使用 Protocol Buffers 对象进行数据的反序列化
bool DeserializePerson(const std::string& serialized_data, PersonData& data) {
Person person; // 使用生成的消息类
if (!person.ParseFromString(serialized_data)) {
std::cerr << "Failed to parse person." << std::endl;
return false;
}
data.name = person.name();
data.age = person.age();
data.gender = static_cast<int>(person.gender());
data.address.country = person.address().country();
data.address.province = person.address().province();
data.address.city = person.address().city();
data.address.street = person.address().street();
return true;
}
int main() {
PersonData data;
data.name = "CC";
data.age = 26;
data.gender = 1; // 1 表示 MALE,2 表示 FEMALE
data.address.country = "CHINA";
data.address.province = "GD";
data.address.city = "SZ";
data.address.street = "123 Main St";
// 序列化
std::string serialized_data = SerializePerson(data);
if (serialized_data.empty()) {
return 1;
}
std::cout << "Serialized data: " << serialized_data << std::endl;
// 反序列化
PersonData deserialized_data;
if (DeserializePerson(serialized_data, deserialized_data)) {
std::cout << "Deserialized data: " << std::endl;
std::cout << "Name: " << deserialized_data.name << std::endl;
std::cout << "Age: " << deserialized_data.age << std::endl;
std::cout << "Gender: " << deserialized_data.gender << std::endl;
std::cout << "Address: " << std::endl;
std::cout << "Country: " << deserialized_data.address.country << std::endl;
std::cout << "Province: " << deserialized_data.address.province << std::endl;
std::cout << "City: " << deserialized_data.address.city << std::endl;
std::cout << "Street: " << deserialized_data.address.street << std::endl;
} else {
std::cerr << "Failed to deserialize person." << std::endl;
return 1;
}
return 0;
}
编译
g++ -o person main.cpp person.pb.cc -lprotobuf
执行
./person
Serialized data:
CC"
123 Main StSZGD"CHINA
Deserialized data:
Name: CC
Age: 26
Gender: 1
Address:
Country: CHINA
Province: GD
City: SZ
Street: 123 Main St