Protocol Buffers لـ C++: دليل شامل مع أمثلة
Protocol Buffers (protobuf) هي آلية قوية ومرنة وفعالة لتسلسل البيانات المهيكلة، طورتها شركة Google. تتيح لك تحديد بنية البيانات مرة واحدة في ملف خاص (`.proto`)، ثم توليد كود مصدري بلغات برمجة مختلفة (بما في ذلك C++) لقراءة وكتابة هذه البيانات. على عكس الصيغ مثل JSON أو XML، يستخدم protobuf صيغة ثنائية، مما يجعله أسرع وأكثر ضغطًا بشكل ملحوظ.
لماذا تحتاج Protocol Buffers؟ في تطوير البرمجيات الحديثة، خاصة في الأنظمة الموزعة والخدمات المصغرة والتطبيقات عالية التحميل، تعتبر سرعة نقل البيانات وحجمها وموثوقيتها أمرًا بالغ الأهمية. يحل Protobuf هذه المشكلات: فهو يوفر كتابة صارمة للأنواع (لا يمكنك إرسال سلسلة نصية بدلاً من رقم عن طريق الخطأ)، وتوليدًا تلقائيًا للكود (أخطاء أقل مرتبطة بالتحليل اليدوي)، وتوافقًا عكسيًا (يمكنك إضافة حقول جديدة دون كسر العملاء القدامى)، وأداءً عاليًا بفضل الصيغة الثنائية.
هذه المقالة هي دليل شامل ومفصل لاستخدام Protocol Buffers في C++. سنبدأ بالتثبيت، ونمر عبر إنشاء أول مثال، ونشرح الطرق والفئات الأساسية، ثم ننتقل إلى مثال عملي حقيقي. ستتعلم كيفية استخدام protobuf بكفاءة في مشاريعك، وما هي المخاطر التي يجب تجنبها.
تثبيت Protocol Buffers لـ C++
للعمل مع Protocol Buffers في C++، ستحتاج إلى شيئين: المترجم `protoc` نفسه (لتوليد كود C++ من ملفات `.proto`) ومكتبة وقت التشغيل (`libprotobuf`).
الخطوة 1: تثبيت المترجم `protoc`
أسهل طريقة على Linux/macOS هي استخدام مدير الحزم. على Windows، يمكنك تنزيل ملف ثنائي جاهز من GitHub أو استخدام vcpkg.
# Ubuntu / Debian
sudo apt-get install protobuf-compiler libprotobuf-dev
# macOS (Homebrew)
brew install protobuf
# Windows (vcpkg)
vcpkg install protobuf protobuf:x64-windows
الخطوة 2: تثبيت المكتبة لـ C++ (إذا لم تكن مثبتة مع المترجم)
على Linux، حزمة `libprotobuf-dev` تتضمن كل ما تحتاجه. على الأنظمة الأخرى أو للبناء اليدوي:
# تنزيل الكود المصدري من GitHub
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
mkdir build && cd build
cmake .. -Dprotobuf_BUILD_TESTS=OFF
make -j$(nproc)
sudo make install
sudo ldconfig
الخطوة 3: إعداد مشروع CMake
بعد التثبيت، يمكنك ربط protobuf بمشروع CMake الخاص بك:
find_package(protobuf CONFIG REQUIRED)
target_link_libraries(your_target PRIVATE protobuf::libprotobuf)
بداية سريعة: مثال عملي مصغر
لننشئ مثالًا بسيطًا: تسلسل وإلغاء تسلسل معلومات مستخدم.
1. أنشئ ملف `user.proto`:
syntax = "proto3";
package tutorial;
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
2. قم بتوليد كود C++:
protoc --cpp_out=. user.proto
سينشئ هذا الأمر ملفين: `user.pb.h` (ملف الرأس) و `user.pb.cc` (ملف التنفيذ).
3. اكتب برنامج C++ (`main.cpp`):
#include <iostream>
#include <fstream>
#include "user.pb.h"
int main() {
// 1. إنشاء كائن وملؤه
tutorial::User user;
user.set_id(42);
user.set_name("Ali");
user.set_email("ali@example.com");
// 2. تسلسل إلى سلسلة نصية
std::string serialized_data;
if (!user.SerializeToString(&serialized_data)) {
std