भले ही पायथन की स्टैंडर्ड लाइब्रेरी में marshal मॉड्यूल ऑब्जेक्ट सीरियलाइज़ेशन सुविधाएँ प्रदान करता है (pickle मॉड्यूल के समान), यह सामान्य उद्देश्य डेटा पर्सिस्टेंस या सॉकेट्स आदि के माध्यम से पायथन ऑब्जेक्ट्स के ट्रांसमिशन के लिए वास्तव में उपयोगी नहीं है। यह मॉड्यूल ज्यादातर पायथन द्वारा स्वयं पायथन मॉड्यूल्स के कंपाइल्ड संस्करण (.pyc फ़ाइलें) पर रीड/राइट ऑपरेशन्स का समर्थन करने के लिए उपयोग किया जाता है। marshal मॉड्यूल द्वारा उपयोग किया जाने वाला डेटा फॉर्मेट पायथन संस्करणों के बीच कम्पैटिबल नहीं है (सबवर्ज़न तक नहीं)। इसलिए एक संस्करण का कंपाइल्ड पायथन स्क्रिप्ट (.pyc फ़ाइल) सबसे अधिक संभावना दूसरे पर नहीं चलेगी। marshal मॉड्यूल इस प्रकार पायथन की आंतरिक ऑब्जेक्ट सीरियलाइज़ेशन के लिए उपयोग किया जाता है।
pickle मॉड्यूल की तरह, marshal मॉड्यूल भी फ़ाइल से/में मार्शल्ड ऑब्जेक्ट्स को पढ़ने/लिखने के लिए load() और dump() फ़ंक्शन्स को परिभाषित करता है। साथ ही, loads() और dumps() फ़ंक्शन मार्शल्ड ऑब्जेक्ट के स्ट्रिंग रिप्रेजेंटेशन से निपटते हैं।
dumps() - पायथन ऑब्जेक्ट को मार्शल करके बाइट-जैसा ऑब्जेक्ट लौटाता है। मार्शलिंग के लिए केवल स्टैंडर्ड डेटा टाइप्स के ऑब्जेक्ट्स समर्थित हैं। असमर्थित टाइप्स ValueError अपवाद उठाते हैं।
loads() - यह फ़ंक्शन बाइट-जैसे ऑब्जेक्ट को संबंधित पायथन ऑब्जेक्ट में बदलता है। यदि रूपांतरण वैध पायथन ऑब्जेक्ट में परिणाम नहीं देता है, तो ValueError या TypeError उठाया जा सकता है।
निम्न कोड दिखाता है कि डिक्शनरी ऑब्जेक्ट को dumps() का उपयोग करके कैसे मार्शल किया जाता है। बाइट रिप्रेजेंटेशन को loads() फ़ंक्शन द्वारा वापस डिक्शनरी में बदला जाता है।
import marshal
person = {"name": "xyz", "age": 22, "marks": [45, 56, 78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print(obj)
dump() - यह फ़ंक्शन समर्थित पायथन ऑब्जेक्ट के बाइट रिप्रेजेंटेशन को फ़ाइल में लिखता है। फ़ाइल स्वयं राइट परमिशन के साथ बाइनरी फ़ाइल होनी चाहिए।
load() - यह फ़ंक्शन बाइनरी फ़ाइल से बाइट डेटा पढ़ता है और इसे पायथन ऑब्जेक्ट में बदलता है।
जैसा कि ऊपर उल्लेख किया गया है, marshal मॉड्यूल .pyc फ़ाइलों को प्रोसेस करने के लिए उपयोग किया जाता है। निम्न उदाहरण कोड ऑब्जेक्ट्स को हैंडल करने के लिए dump() और load() फ़ंक्शन्स के उपयोग को प्रदर्शित करता है, जिनका उपयोग प्रीकंपाइल्ड पायथन मॉड्यूल्स को स्टोर करने के लिए किया जाता है।
कोड बिल्ट-इन compile() फ़ंक्शन का उपयोग करता है ताकि एक सोर्स स्ट्रिंग से कोड ऑब्जेक्ट बनाया जा सके जिसमें पायथन इंस्ट्रक्शन्स एम्बेडेड हों।
compile(source, file, mode)
file पैरामीटर वह फ़ाइल होनी चाहिए जिससे कोड पढ़ा गया था। यदि इसे फ़ाइल से नहीं पढ़ा गया था तो कोई भी मनमाना स्ट्रिंग पास करें।
mode पैरामीटर 'exec' है यदि सोर्स में स्टेटमेंट्स का अनुक्रम है, 'eval' यदि सिंगल एक्सप्रेशन है या 'single' यदि इसमें सिंगल इंटरैक्टिव स्टेटमेंट है।
कंपाइल्ड कोड ऑब्जेक्ट को फिर dump() फ़ंक्शन का उपयोग करके .pyc फ़ाइल में स्टोर किया जाता है:
import marshal
script = """
a = 10
b = 20
print('addition = ', a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc", "wb")
marshal.dump(code, f)
f.close()
.pyc फ़ाइल से ऑब्जेक्ट को डिसीरियलाइज़ करने के लिए load() फ़ंक्शन का उपयोग करें। चूंकि यह कोड ऑब्जेक्ट लौटाता है, इसे exec(), एक अन्य बिल्ट-इन फ़ंक्शन का उपयोग करके चलाया जा सकता है।
import marshal
f = open("a.pyc", "rb")
data = marshal.load(f)
exec(data)
आउटपुट सोर्स स्ट्रिंग में एम्बेडेड कोड ब्लॉक का परिणाम होगा:
addition = 30