protobuf安装与使用

安装

更新系统软件包列表

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值