অবজেক্ট সিরিয়ালাইজেশন বলতে একটি অবজেক্টের স্টেটকে বাইট স্ট্রিমে রূপান্তর করার প্রক্রিয়াকে বোঝায়। একবার তৈরি হলে, এই বাইট স্ট্রিমকে আরও একটি ফাইলে সংরক্ষণ করা যায় বা সকেটের মাধ্যমে ট্রান্সমিট করা যায়। অন্যদিকে, বাইট স্ট্রিম থেকে অবজেক্ট পুনরায় তৈরি করা ডিসিরিয়ালাইজেশন বলা হয়।
সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের জন্য পাইথনের টার্মিনোলজি হলো পিকলিং এবং আনপিকলিং। পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে উপলব্ধ pickle মডিউল সিরিয়ালাইজেশন (dump() এবং dumps()) এবং ডিসিরিয়ালাইজেশন (load() এবং loads()) এর জন্য ফাংশন প্রদান করে।
pickle মডিউল খুব পাইথন-স্পেসিফিক ডেটা ফরম্যাট ব্যবহার করে। অতএব, পাইথনে না লেখা প্রোগ্রামগুলো এনকোডেড (পিকল্ড) ডেটা সঠিকভাবে ডিসিরিয়ালাইজ করতে পারে না। এছাড়া, অন-অথেন্টিকেটেড সোর্স থেকে ডেটা আনপিকল করা নিরাপদ বলে বিবেচনা করা হয় না।
পিকল প্রোটোকল
প্রোটোকলগুলো হলো পাইথন অবজেক্ট বাইনারি ডেটা থেকে/এতে কনস্ট্রাক্ট এবং ডিকনস্ট্রাক্ট করার কনভেনশন। বর্তমানে pickle মডিউল ৫টি আলাদা প্রোটোকল সংজ্ঞায়িত করে:
| প্রোটোকল ভার্সন ০ | মূল "মানব-পঠনযোগ্য" প্রোটোকল سابق সংস্করণের সাথে ব্যাকওয়ার্ডস কম্প্যাটিবল। |
| প্রোটোকল ভার্সন ১ | পুরনো বাইনারি ফরম্যাট سابق পাইথন সংস্করণের সাথে কম্প্যাটিবল। |
| প্রোটোকল ভার্সন ২ | পাইথন ২.৩-এ পরিচয় করানো হয়। new-style ক্লাসের দক্ষ পিকলিং প্রদান করে। |
| প্রোটোকল ভার্সন ৩ | পাইথন ৩.০-এ যোগ করা হয়। অন্যান্য পাইথন ৩ সংস্করণের সাথে কম্প্যাটিবিলিটির জন্য রিকমেন্ডেড। |
| প্রোটোকল ভার্সন ৪ | পাইথন ৩.৪-এ যোগ করা হয়। খুব বড় অবজেক্টের জন্য সাপোর্ট যোগ করে। |
আপনার পাইথন ইনস্টলেশনের হাইএস্ট এবং ডিফল্ট প্রোটোকল ভার্সন জানতে pickle মডিউলে সংজ্ঞায়িত নিচের কনস্ট্যান্ট ব্যবহার করুন:
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 4 >>> pickle.DEFAULT_PROTOCOL 3
উল্লেখ্য 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 মডিউলও আছে যা পাইথন অবজেক্টের ইন্টারনাল সিরিয়ালাইজেশনের জন্য ব্যবহৃত হয়।