تسلسل الكائنات في C++: المكتبات والطرق وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تسلسل الكائنات في 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                    

توصيات