हाल ही में एक प्रोजेक्ट अपडेट मीटिंग के दौरान, मेरी टीम ने इस बारे में बात की कि हम इस एप्लिकेशन से डेटा को आगे-पीछे भेजने के लिए सीरियलाइज़ेशन का उपयोग कैसे करने जा रहे थे।
एक इंजीनियर जो सॉफ्टवेयर प्रोजेक्ट्स में अधिक शामिल होना चाह रहा था, उसने मुझे बताया कि वह इस शब्द से अपरिचित था।
इस तरह की आवश्यक प्रक्रियाओं को याद करना आसान है जो तब तक सामने नहीं आतीं जब तक आप अधिक व्यापक प्रोजेक्ट्स में गोता नहीं लगाते। यह उस व्यक्ति के लिए मामला था, जैसा कि एक समय मेरे लिए था।
इसलिए मैं इसके बारे में लिखना चाहता था। मैंने उस दिन अपने सहयोगी को सीरियलाइज़ेशन के बारे में सीखने में मदद की, और आज आप इसके बारे में सीखने जा रहे हैं।
सीरियलाइज़ेशन क्या है?
सीरियलाइज़ेशन वह प्रक्रिया है जिसमें एक सर्विस एक डेटा संरचना लेती है, जैसे Python में एक डिक्शनरी, उसे लपेटती है, और पढ़ने के लिए दूसरी सर्विस को ट्रांसमिट करती है। यह सरल परिभाषा है।
कल्पना करें कि मुझे किसी को संदेश भेजना है। तो मैं पहले से असेंबल पहेली पर टेक्स्ट लिखता हूं। मैं टुकड़ों को अलग करता हूं, पहेली को फिर से जोड़ने के निर्देश जोड़ता हूं, और इसे भेज देता हूं।
संदेश प्राप्तकर्ता तब पहेली के टुकड़े प्राप्त करता है, उन सभी को वापस एक साथ जोड़ता है, और अब उनके पास मेरा संदेश है।

तकनीकी परिभाषा थोड़ी अधिक मजेदार है। सीरियलाइज़ेशन एक डेटा ऑब्जेक्ट को बाइट स्ट्रीम में बदलने की प्रक्रिया है, और ऑब्जेक्ट की स्थिति को डिस्क पर संग्रहीत करने या नेटवर्क पर ट्रांसमिट करने के लिए सहेजना है। यह आवश्यक स्टोरेज आकार को कम करता है और नेटवर्क पर जानकारी ट्रांसफर करना आसान बनाता है।

मार्शलिंग और सीरियलाइज़ेशन - अंतर क्या हैं?
मार्शलिंग की प्रक्रिया दिमाग में आ सकती है। मार्शलिंग एक ऑब्जेक्ट के मेमोरी प्रतिनिधित्व को ट्रांसमिशन के लिए उपयुक्त रूप में बदलने की प्रक्रिया है।
हालांकि मार्शलिंग और सीरियलाइज़ेशन ढीले तौर पर समानार्थी हैं, एक महत्वपूर्ण अंतर है। उदाहरण के लिए, जब JSON डेटा को Golang डेटा संरचना में पढ़ने के लिए एक Golang प्रोग्राम बनाते हैं, तो आप JSON की वैल्यूज़ को Golang की वैल्यूज़ में अनुवाद करने के लिए मार्शलिंग का उपयोग कर सकते हैं।
अंतर यह है कि मार्शलिंग का उपयोग डेटा का अनुवाद करने के लिए किया जा सकता है। इसके विपरीत, सीरियलाइज़ेशन डेटा को बाइट स्ट्रीम में भेजता या संग्रहीत करता है और इसे अपने मूल रूप में फिर से असेंबल करता है। दोनों सीरियलाइज़ेशन करते हैं, लेकिन इन दो प्रक्रियाओं में इरादे में अंतर है।
आप नीचे मेरे द्वारा Twitter डेटा के साथ इंटरैक्ट करने के लिए बनाए गए इस स्ट्रक को मार्शलिंग के एक उदाहरण के रूप में देख सकते हैं। Golang में, आप टैग्स कहलाने वाले संकेत दे सकते हैं, Golang की अंतर्निहित मार्शलिंग सेवा का उपयोग करके इस ऑब्जेक्ट को JSON डेटा में आसानी से परिवर्तित कर सकते हैं।

एंडियननेस क्या है?
मैं एंडियननेस के विषय पर भी हल्के से छूना चाहूंगा। एंडियननेस मेमोरी में बाइट्स के क्रम का वर्णन करने के लिए इस्तेमाल किया जाने वाला शब्द है।
आप मेमोरी को एक ब्लॉक के रूप में सोच सकते हैं जहां डेटा के बाइट्स संग्रहीत होते हैं। सीरियलाइज़ेशन के काम करने के लिए, बाइट स्ट्रीम को एक सिस्टम से दूसरे सिस्टम में बदलते एंडियननेस की परवाह किए बिना डेटा प्रकारों को ट्रांसफर करने की आवश्यकता होती है।
आप नीचे लिटिल और बिग-एंडियन अंतर देख सकते हैं। यह आवश्यक है कि एक सिस्टम से दूसरे सिस्टम में एंडियननेस मेल खाए या किसी तरह परिवर्तित हो, क्योंकि सभी सिस्टम अपने बिट्स को उसी तरह ऑर्डर नहीं करते हैं।

सीरियलाइज़ेशन के उपयोग के मामले
हमारा उपयोग मामला इन सुविधाओं का पूरा लाभ उठाता है। हम अपने द्वारा स्कैन किए जा रहे हार्डवेयर से कुछ जानकारी लेने, उस जानकारी को बाइट स्ट्रीम में पैकेज करने, और नेटवर्क के साथ दूसरी सर्विस को भेजने की योजना बना रहे हैं जो डेटा को पुनर्निर्मित करेगी।
सीरियलाइज़ेशन प्रक्रिया को उलटने और डेटा को उसके मूल रूप में पुनर्निर्मित करने की प्रक्रिया को डिसीरियलाइज़ेशन कहा जाता है।
इसके लिए अन्य उपयोग के मामले भी हैं। उदाहरण के लिए, REST APIs या AMQP जैसे मैसेजिंग प्रोटोकॉल डेटा को कंप्रेस और भेजने के लिए सीरियलाइज़ेशन का उपयोग कर सकते हैं।
AMQP एक मैसेजिंग प्रोटोकॉल है जहां आप मैसेजेस को AMQP ब्रोकर को भेजते हैं, और प्राप्त करने वाली सर्विस इस ब्रोकर को मैसेज के लिए "सुन" रही होती है। बैकएंड इंजीनियर्स इसे अच्छी तरह से जान सकते हैं, क्योंकि इसका उपयोग अक्सर वितरित सिस्टम के भीतर डेटा को आगे-पीछे भेजने के लिए किया जाता है।
कई प्रोग्रामिंग भाषाओं में आसानी से कुछ सीरियलाइज़ेशन शुरू करने की क्षमता शामिल है। इसलिए यह एक भाषा-अज्ञेय विषय है।
सीरियलाइज़ेशन उदाहरण
आइए एक त्वरित उदाहरण दें। यह कोड AMQP के माध्यम से संदेश भेजने के लिए kombu लाइब्रेरी का उपयोग करता है। हम इसका उपयोग एक सॉफ्टवेयर पैकेज से दूसरे में नेटवर्क पर संदेश भेजने के लिए कर रहे हैं। यह कोड AMQP ब्रोकर को संदेश भेजने वाली सर्विस के लिए है:
def send_message(self, payload, sender_serializer): ... try: producer.publish( {'payload': message}, ... serializer = 'json', ... ) return publish मेथड पर ध्यान दें। हम सीरियलाइज़ेशन मेथड को एक आर्गुमेंट के रूप में पास कर रहे हैं ताकि लाइब्रेरी को पता चले कि हम जो डेटा पास कर रहे हैं उसे कैसे सीरियलाइज़ करना है।
डेटा मैसेज बाइट्स की एक स्ट्रीम में परिवर्तित हो जाता है, जो यदि आप इसे देखते हैं, तो अक्षरों और संख्याओं की एक लंबी स्ट्रिंग की तरह दिखता है, और हम संदेश भेजते हैं।
संबंधित सर्विस डेटा को उसकी मूल स्थिति में पुनर्निर्मित करने के लिए उसी सीरियलाइज़ेशन मेथड का उपयोग करेगी। यह एक महत्वपूर्ण विशेषता है क्योंकि हम टूल्स का एक सूट बना रहे हैं जिन्हें काम करने के लिए एक दूसरे को संदेश भेजने में सक्षम होने की आवश्यकता है।
सीरियलाइज़ेशन डेटा फॉर्मेट्स
जब भी हाथ में काम इसके लिए बुलाता है, मैं सीरियलाइज़ेशन के लिए JSON का उपयोग करता हूं। हालांकि, आप कुछ अन्य का भी उपयोग कर सकते हैं।
JSON में बहुत अधिक ओवरहेड होता है, लेकिन मानव पठनीयता इसे मेरे लिए आदर्श बनाती है। आप Protobufs, YAML, या XML का भी उपयोग कर सकते हैं। ये केवल कुछ डेटा ऑब्जेक्ट फॉर्मेट हैं जिनका आप उपयोग कर सकते हैं।
निष्कर्ष
मुझे खुशी है कि मैंने इसे अपने सिस्टम से बाहर निकाल लिया। मुझे इसके बारे में सोचना बंद करना पड़ा, और उम्मीद है कि किसी ने इससे कुछ सीखा।
जब आप अपना कम्युनिकेशन पाइपलाइन एक साथ रख रहे होते हैं तो सीरियलाइज़ेशन आवश्यक हो जाता है। इस विषय के बारे में जानना अच्छा है ताकि आप उचित पृष्ठभूमि ज्ञान के साथ जो भी टूल उपयोग कर रहे हैं उससे आत्मविश्वास से संपर्क कर सकें।
-George