تسلسل الكائنات في C++: نظرة عامة على الأدوات والمكتبات
\n\nالتسلسل هو عملية تحويل هياكل البيانات المعقدة (الكائنات، المصفوفات، الرسوم البيانية) إلى تنسيق خطي (تيار بايت، سلسلة JSON، XML) يمكن حفظه في ملف، أو نقله عبر الشبكة، أو كتابته في قاعدة بيانات. العملية العكسية - إلغاء التسلسل - تستعيد الحالة الأصلية للكائن. في C++ لا يوجد دعم مدمج للانعكاس (كما في Java أو Python)، لذلك من أجل التسلسل، يجب إما كتابة التعليمات البرمجية يدويًا أو استخدام مكتبات جاهزة. في هذه المقالة، سنناقش الأدوات الأكثر شيوعًا وفعالية للتسلسل في C++.
\n\n1. Boost.Serialization
\n\nأقدم وأقوى مكتبة. وهي جزء من Boost، وتتطلب تثبيتًا منفصلاً. تدعم الأرشفة الثنائية والنصية (XML) والأرشفة المحمولة الخاصة بها.
\n\n- \n
- المزايا: دعم عميق لـ STL، المؤشرات الذكية، تعدد الأشكال، المراجع الدائرية؛ التحكم في الإصدارات؛ التوافق بين المنصات المختلفة. \n
- العيوب: بناء جملة ضخم، تجميع بطيء، حجم ملف تنفيذي كبير. \n
#include <boost/archive/text_oarchive.hpp>\n#include <boost/archive/text_iarchive.hpp>\n#include <boost/serialization/vector.hpp>\n#include <fstream>\n#include <vector>\n\nstruct Person {\n std::string name;\n int age;\n std::vector<std::string> tags;\n\n template<class Archive>\n void serialize(Archive & ar, const unsigned int version) {\n ar & name;\n ar & age;\n ar & tags;\n }\n};\n\nint main() {\n Person p{"Alice", 30, {"developer", "cpp"}};\n std::ofstream ofs("person.txt");\n boost::archive::text_oarchive oa(ofs);\n oa << p;\n\n // إلغاء التسلسل\n Person restored;\n std::ifstream ifs("person.txt");\n boost::archive::text_iarchive ia(ifs);\n ia >> restored;\n return 0;\n}\n\n2. Cereal
\n\nمكتبة حديثة، خفيفة، تعتمد على الرؤوس فقط (لا تتطلب بناء). تعمل مع C++11 والإصدارات الأحدث. تدعم تنسيقات JSON وXML والثنائية. تحظى بشعبية كبيرة في صناعة الألعاب والتطوير المضمن.
\n\n- \n
- المزايا: تكلفة عامة ضئيلة، واجهة برمجة تطبيقات بديهية، دعم المؤشرات الذكية، تعدد الأشكال، حاويات STL. \n
- العيوب: خيارات تخصيص أقل مقارنة بـ Boost. \n
#include <cereal/archives/json.hpp>\n#include <cereal/types/vector.hpp>\n#include <cereal/types/string.hpp>\n#include <sstream>\n\nstruct Person {\n std::string name;\n int age;\n\n template<class Archive>\n void serialize(Archive & ar) {\n ar(CEREAL_NVP(name), CEREAL_NVP(age));\n }\n};\n\nint main() {\n Person p{"Bob", 25};\n std::ostringstream oss;\n {\n cereal::JSONOutputArchive archive(oss);\n archive(CEREAL_NVP(p));\n }\n std::cout << oss.str() << std::endl;\n\n // إلغاء التسلسل\n Person restored;\n std::istringstream iss(oss.str());\n {\n cereal::JSONInputArchive archive(iss);\n archive(restored);\n }\n return 0;\n}\n\n3. nlohmann/json (JSON for Modern C++)
\n\nالمكتبة الأكثر شيوعًا للعمل مع JSON في C++. على الرغم من أنها لم تُصمم في الأصل لتسلسل الكائنات، إلا أنه يمكن تكييفها بسهولة باستخدام محولات مخصصة (نمط المحول).
\n\n- \n
- المزايا: بناء جملة بسيط وجميل، وثائق ممتازة، تعتمد على الرؤوس فقط، تكامل مع أي أنواع. \n
- العيوب: تعمل فقط مع JSON، لا تدعم التنسيقات الثنائية، تتطلب وصفًا يدويًا للرسوم البيانية المعقدة للكائنات. \n
#include <nlohmann/json.hpp>\n#include <fstream>\n\nusing json = nlohmann::json;\n\nstruct Point {\n double x, y;\n