تسلسل الكائنات في C++: دليل شامل
التسلسل هو عملية تحويل هياكل البيانات المعقدة (كائنات الفئات، الحاويات) إلى تنسيق تسلسلي (تيار بايت، سلسلة JSON، XML) مناسب للحفظ في ملف أو النقل عبر الشبكة. العملية العكسية - إلغاء التسلسل - تستعيد الكائن من هذا التنسيق. في C++، حيث لا يوجد انعكاس مدمج، يتطلب التسلسل وصفًا يدويًا أو استخدام مكتبات متخصصة. في هذه المقالة، سنستعرض الطرق الرئيسية وأفضل الأدوات للتسلسل في C++.
لماذا نحتاج التسلسل؟
- حفظ الحالة - تسجيل حفظ اللعبة، إعدادات التطبيق.
- التفاعل الشبكي - نقل الكائنات بين العميل والخادم.
- التخزين المؤقت - حفظ نتائج الحسابات في ملف.
- تبادل البيانات - التكامل مع لغات أخرى (JSON، Protobuf).
المكتبات الشائعة للتسلسل في C++
1. Boost.Serialization
مكتبة كلاسيكية من مجموعة Boost. تدعم التسلسل الثنائي والنصي وXML. تتطلب إضافة طرق serialize أو save/load بشكل صريح.
#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <fstream>
class Person {public: std::string name; int age; template<class Archive> void serialize(Archive& ar, const unsigned int version) { ar & name; ar & age; }};
// حفظvoid save(const Person& p) { std::ofstream ofs("person.txt"); boost::archive::text_oarchive oa(ofs); oa << p;}
// تحميلPerson load() { Person p; std::ifstream ifs("person.txt"); boost::archive::text_iarchive ia(ifs); ia >> p; return p;}2. Cereal
مكتبة حديثة وخفيفة (ملفات رأس فقط). تدعم JSON، XML، التنسيق الثنائي. لا تتطلب وراثة من الفئات الأساسية. مناسبة تمامًا للمشاريع التي لا تحتاج إلى Boost بأكمله.
#include <cereal/archives/json.hpp>#include <cereal/types/string.hpp>#include <cereal/types/vector.hpp>#include <fstream>
struct Student { std::string name; std::vector<int> grades; template<class Archive> void serialize(Archive& ar) { ar(CEREAL_NVP(name), CEREAL_NVP(grades)); }};
// حفظ إلى JSONvoid saveStudent(const Student& s) { std::ofstream ofs("student.json"); cereal::JSONOutputArchive archive(ofs); archive(CEREAL_NVP(s));}
// تحميل من JSONStudent loadStudent() { Student s; std::ifstream ifs("student.json"); cereal::JSONInputArchive archive(ifs); archive(s); return s;}3. nlohmann/json (JSON لـ C++ الحديثة)
ليست مكتبة تسلسل بالمعنى الكلاسيكي، ولكنها تسمح بتحويل الكائنات بسهولة إلى JSON والعكس. تتطلب كتابة دوال التحويل يدويًا.
#include <nlohmann/json.hpp>using json = nlohmann::json;
struct Point { int x, y;};
void to_json(json& j, const Point& p) { j = json{{"x", p.x}, {"y", p.y}};}
void from_json(const json& j, Point& p) { j.at("x").get_to(p.x); j.at("y").get_to(p.y);}
// الاستخدامPoint p1{10, 20};json j = p1; // تسلسلPoint p2 = j.get<Point>(); // إلغاء التسلسل4. Protocol Buffers (protobuf)
مطور من Google. يتطلب وصف الهياكل في ملفات .proto، ثم يتم إنشاء كود C++. يعد بتنسيق ثنائي مضغوط وسرعة عالية.
// ملف person.protosyntax = "proto3";message P