Trang tài liệu
Khóa học C++ nền tảng
Chương 20. Thư viện
Bộ đệm giao thức (protobuf)

Bộ đệm giao thức (protobuf)

Bộ đệm giao thức, hay protobuf, là định dạng tuần tự hóa dữ liệu trung lập với ngôn ngữ và nền tảng do Google phát triển. Nó được sử dụng để tuần tự hóa dữ liệu có cấu trúc một cách hiệu quả để sử dụng trong các giao thức truyền thông, lưu trữ dữ liệu, v.v. Nó có thể mở rộng, vì nó cho phép bạn xác định cấu trúc dữ liệu tùy chỉnh của riêng mình được gọi là “thông báo” với các loại trường vô hướng và phức tạp khác nhau.

Dưới đây là một bản tóm tắt ngắn gọn về protobuf và cách sử dụng nó trong C++:

  • Xác định tệp .proto của bạn: Tạo tệp .proto xác định cấu trúc thông báo của bạn.

Ví dụ:

syntax = "proto3";
 
message Person {
    string name = 1;
    int32 age = 2;
    string email = 3;
}
  • *Biên dịch tệp .proto: Bạn cần biên dịch tệp .proto của mình để tạo các lớp C++ cho tuần tự hóa và giải tuần tự hóa.

    Ví dụ:

    protoc --cpp_out=. person.proto

    Thao tác này sẽ tạo ra hai tệp: person.pb.cc và person.pb.h chứa các định nghĩa lớp C++.

  • Đưa thư viện protobuf và các tệp được tạo vào mã code C++ của bạn: Bạn sẽ cần đưa thư viện protobuf và các tệp được tạo vào mã code C++ chính của mình.

    Ví dụ:

    #include <iostream>
    #include <fstream>
    #include "person.pb.h"
     
    int main () {
        GOOGLE_PROTOBUF_VERIFY_VERSION; // Xác minh rằng tiêu đề thư viện protobuf phù hợp với phiên bản thư viện
     
        // Tuần tự hóa một thông báo Person
        Person person;
        person.set_name("Sam");
        person.set_age(35);
        person.set_email("sam@example.com");
     
        // Lưu dữ liệu vào một tập tin
        std::ofstream output("person.bin", ios::binary);
        person.SerializeToOstream(&output);
        output.close();
     
        // Giải tuần tự hóa thông báo từ tập tin
        Person input_person;
        std::ifstream input("person.bin", ios::binary);
        input_person.ParseFromIstream(&input);
        input.close();
     
        // In thông báo đã giải tuần tự hóa
        std::cout << "Name: " << input_person.name() << std::endl;
        std::cout << "Age: " << input_person.age() << std::endl;
        std::cout << "Email: " << input_person.email() << std::endl;
     
        google::protobuf::ShutdownProtobufLibrary();
     
        return 0;
    }
  • Biên dịch và liên kết mã code C++ của bạn: Cuối cùng, biên dịch mã code C++ của bạn và liên kết nó với thư viện protobuf.

    Ví dụ:

    g++ -std=c++11 -o main main.cpp person.pb.cc -lprotobuf

Để biết thêm thông tin và ví dụ, bạn có thể tham khảo hướng dẫn chính thức của protobuf C++.