ऑब्जेक्ट सीरियलाइज़ेशन शब्द ऑब्जेक्ट की स्थिति को बाइट स्ट्रीम में बदलने की प्रक्रिया को संदर्भित करता है। एक बार बनने के बाद, इस बाइट स्ट्रीम को फ़ाइल में स्टोर किया जा सकता है या सॉकेट्स आदि के माध्यम से ट्रांसमिट किया जा सकता है। दूसरी ओर, बाइट स्ट्रीम से ऑब्जेक्ट को पुनर्निर्मित करना डिसीरियलाइज़ेशन कहलाता है।
सीरियलाइज़ेशन और डिसीरियलाइज़ेशन के लिए पायथन की शब्दावली क्रमशः पिकलिंग और अनपिकलिंग है। पायथन की स्टैंडर्ड लाइब्रेरी में उपलब्ध pickle मॉड्यूल सीरियलाइज़ेशन (dump() और dumps()) और डिसीरियलाइज़ेशन (load() और loads()) के लिए फ़ंक्शन्स प्रदान करता है।
pickle मॉड्यूल बहुत पायथन-विशिष्ट डेटा फॉर्मेट का उपयोग करता है। इसलिए, पायथन में नहीं लिखे गए प्रोग्राम एन्कोडेड (पिकल्ड) डेटा को ठीक से डिसीरियलाइज़ नहीं कर पाएंगे। साथ ही, अनधिकृत स्रोत से डेटा अनपिकल करना सुरक्षित नहीं माना जाता।
पिकल प्रोटोकॉल्स
प्रोटोकॉल्स पायथन ऑब्जेक्ट्स को बाइनरी डेटा से/में बनाने और विघटित करने में उपयोग किए जाने वाले कन्वेंशन हैं। वर्तमान में pickle मॉड्यूल नीचे सूचीबद्ध 5 अलग-अलग प्रोटोकॉल्स को परिभाषित करता है:
| प्रोटोकॉल संस्करण 0 | मूल "मानव-पठनीय" प्रोटोकॉल पहले के संस्करणों के साथ बैकवर्ड्स कम्पैटिबल। |
| प्रोटोकॉल संस्करण 1 | पुराना बाइनरी फॉर्मेट पहले के पायथन संस्करणों के साथ भी कम्पैटिबल। |
| प्रोटोकॉल संस्करण 2 | पायथन 2.3 में पेश किया गया, न्यू-स्टाइल क्लासेस की कुशल पिकलिंग प्रदान करता है। |
| प्रोटोकॉल संस्करण 3 | पायथन 3.0 में जोड़ा गया। जब अन्य पायथन 3 संस्करणों के साथ कम्पैटिबिलिटी आवश्यक हो तो अनुशंसित। |
| प्रोटोकॉल संस्करण 4 | पायथन 3.4 में जोड़ा गया। बहुत बड़े ऑब्जेक्ट्स के लिए सपोर्ट जोड़ता है। |
अपने पायथन इंस्टॉलेशन के उच्चतम और डिफ़ॉल्ट प्रोटोकॉल संस्करण को जानने के लिए pickle मॉड्यूल में परिभाषित निम्न स्थिरांकों का उपयोग करें:
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 4 >>> pickle.DEFAULT_PROTOCOL 3
जैसा कि पहले उल्लेख किया गया है, pickle मॉड्यूल के dump() और load() फ़ंक्शन्स पायथन डेटा की पिकलिंग और अनपिकलिंग करते हैं। dump() फ़ंक्शन पिकल्ड ऑब्जेक्ट को फ़ाइल में लिखता है और load() फ़ंक्शन बाइनरी फ़ाइल से डेटा को पायथन ऑब्जेक्ट में अनपिकल करता है।
निम्न प्रोग्राम डिक्शनरी ऑब्जेक्ट को बाइनरी फ़ाइल में पिकल करता है।
import pickle
f = open("data.txt", "wb")
dct = {"name": "Ravi", "age": 23, "Gender": "M", "marks": 75}
pickle.dump(dct, f)
f.close()
जब उपरोक्त कोड एक्ज़ीक्यूट होता है, तो डिक्शनरी ऑब्जेक्ट का बाइट रिप्रेजेंटेशन data.txt फ़ाइल में स्टोर हो जाएगा।
बाइनरी फ़ाइल से डेटा को वापस डिक्शनरी में अनपिकल या डिसीरियलाइज़ करने के लिए निम्न प्रोग्राम चलाएं:
import pickle
f = open("data.txt", "rb")
d = pickle.load(f)
print(d)
f.close()
पायथन कंसोल फ़ाइल से पढ़े गए डिक्शनरी ऑब्जेक्ट को दिखाता है:
{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}
pickle मॉड्यूल में dumps() फ़ंक्शन भी होता है जो पिकल्ड डेटा का स्ट्रिंग रिप्रेजेंटेशन लौटाता है।
>>> from pickle import dumps
>>> dct = {"name": "Ravi", "age": 23, "Gender": "M", "marks": 75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'
स्ट्रिंग को अनपिकल करके मूल डिक्शनरी ऑब्जेक्ट प्राप्त करने के लिए loads() फ़ंक्शन का उपयोग करें।
>>> from pickle import loads
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
pickle मॉड्यूल Pickler और Unpickler क्लासेस भी परिभाषित करता है। Pickler क्लास पिकल डेटा को फ़ाइल में लिखती है। Unpickler क्लास फ़ाइल से बाइनरी डेटा पढ़ती है और पायथन ऑब्जेक्ट बनाती है।
पायथन ऑब्जेक्ट के पिकल्ड डेटा को लिखने के लिए:
from pickle import Pickler
f = open("data.txt", "wb")
dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close()
बाइनरी फ़ाइल से डेटा को अनपिकल करके वापस पढ़ने के लिए:
from pickle import Unpickler
f = open("data.txt", "rb")
dct = Unpickler(f).load()
print(dct)
f.close()
सभी पायथन स्टैंडर्ड डेटा टाइप्स के ऑब्जेक्ट्स पिकल करने योग्य हैं। इसके अलावा, कस्टम क्लास के ऑब्जेक्ट्स को भी पिकल और अनपिकल किया जा सकता है।
from pickle import *
class person:
def __init__(self):
self.name = "XYZ"
self.age = 22
def show(self):
print("name:", self.name, "age:", self.age)
p1 = person()
f = open("data.txt", "wb")
dump(p1, f)
f.close()
print("unpickled")
f = open("data.txt", "rb")
p1 = load(f)
p1.show()
पायथन लाइब्रेरी में marshal मॉड्यूल भी है जिसका उपयोग पायथन ऑब्जेक्ट्स की आंतरिक सीरियलाइज़ेशन के लिए किया जाता है।