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)); }};
// JSON में सहेजनाvoid saveStudent(const Student& s) { std::ofstream ofs("student.json"); cereal::JSONOutputArchive archive(ofs); archive(CEREAL_NVP(s));}
// JSON से लोड करनाStudent loadStudent() { Student s; std::ifstream ifs("student.json"); cereal::JSONInputArchive archive(ifs); archive(s); return s;}3. nlohmann/json (आधुनिक C++ के लिए JSON)
यह क्लासिक अर्थों में सीरियलाइज़ेशन लाइब्रेरी नहीं है, लेकिन यह ऑब्जेक्ट को 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