ما هي مكتبة cereal ولماذا تحتاجها؟
cereal هي مكتبة خفيفة الوزن، تعتمد فقط على ملفات الرأس (header-only)، لتسلسل البيانات في لغة C++. تتيح لك تحويل هياكل البيانات المعقدة (مثل الكلاسات، الـ structs، وحاويات STL) إلى صيغ مثل JSON وXML والصيغة الثنائية، ثم استعادتها مرة أخرى. هذا أمر بالغ الأهمية لحفظ حالة البرنامج، نقل البيانات عبر الشبكة، تسجيل الأحداث، أو تبادل المعلومات بين لغات برمجة مختلفة.
على عكس الحلول الأثقل (مثل Boost.Serialization)، لا تتطلب cereal أي تجميع مسبق أو إعدادات معقدة. فهي مكونة بالكامل من ملفات رأس، مما يبسط دمجها في أي مشروع. المزايا الرئيسية:
- تعتمد فقط على ملفات الرأس: لا حاجة لبناء المكتبة بشكل منفصل.
- دعم C++11/14/17: تستخدم أحدث ميزات اللغة.
- مرونة عالية: تدعم الأنواع المخصصة، المؤشرات الذكية، وتعدد الأشكال.
- أداء ممتاز: الصيغة الثنائية سريعة جدًا وصغيرة الحجم.
طريقة التثبيت
نظرًا لأن cereal مكتبة تعتمد فقط على ملفات الرأس، فإن التثبيت يقتصر على نسخ ملفات الرأس إلى مشروعك. لا حاجة لأوامر pip install أو npm install في C++. إليك طريقتان رئيسيتان:
الطريقة الأولى: التثبيت اليدوي (موصى به للمبتدئين)
- حمّل أحدث إصدار من GitHub (الزر الأخضر "Code" ← "Download ZIP").
- فك ضغط الملف.
- انسخ مجلد
include/cerealإلى مجلد مشروعك. - في الكود، استخدم:
#include "cereal/cereal.hpp".
الطريقة الثانية: عبر مدير الحزم vcpkg
# قم بتثبيت vcpkg إذا لم يكن مثبتًا
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat # ويندوز
./bootstrap-vcpkg.sh # لينكس/ماك
# قم بتثبيت cereal
.\vcpkg install cereal # ويندوز
./vcpkg install cereal # لينكس/ماك
# أضف في CMakeLists.txt:
# find_package(cereal CONFIG REQUIRED)
# target_link_libraries(your_project PRIVATE cereal::cereal)
بداية سريعة مع مثال برمجي
لننشئ هيكل بيانات بسيط Person ونقوم بتسلسله إلى JSON. أنشئ ملف main.cpp:
#include <iostream>
#include <fstream>
#include <string>
#include <cereal/archives/json.hpp>
#include <cereal/types/string.hpp>
struct Person {
std::string name;
int age;
// دالة إلزامية لـ cereal
template<class Archive>
void serialize(Archive& archive) {
archive(name, age);
}
};
int main() {
Person p1{"أحمد", 30};
// الكتابة إلى ملف
{
std::ofstream file("person.json");
cereal::JSONOutputArchive archive(file);
archive(CEREAL_NVP(p1)); // CEREAL_NVP للحقول المسماة
}
// القراءة من ملف
Person p2;
{
std::ifstream file("person.json");
cereal::JSONInputArchive archive(file);
archive(p2);
}
std::cout << "الاسم: " << p2.name << ", العمر: " << p2.age << std::endl;
return 0;
}
قم بتجميع الكود: g++ -std=c++11 main.cpp -o main. بعد التشغيل، سيظهر ملف person.json بمحتوى {"p1": {"name": "أحمد", "age": 30}}.
الدوال والأساليب الأساسية
فيما يلي العناصر الرئيسية للمكتبة. جميع الأمثلة تفترض وجود #include <cereal/cereal.hpp> والأرشيفات المناسبة.
1. cereal::JSONOutputArchive
الوظيفة: إنشاء أرشيف لكتابة البيانات بصيغة JSON.
المعاملات: يستقبل مرجعًا إلى std::ostream