সিরিয়ালাইজেশন একটি প্রক্রিয়া যেখানে একটি অবজেক্টকে এমন একটি ফরম্যাটে রূপান্তর করা হয় যা সংরক্ষণ করা যায় (ফাইল বা মেমরি বাফারে), যাতে পরে আমরা সেটিকে ডিসিরিয়ালাইজ করে সিরিয়ালাইজড ফরম্যাট থেকে মূল কন্টেন্ট/অবজেক্ট রিকভার করতে পারি। আমরা এই সব অপারেশন করার জন্য পাইথন পিকল (pickle) মডিউল ব্যবহার করব।
পিকলিং (Pickling) কী?
পাইথন পিকল মডিউল পাইথন অবজেক্ট স্ট্রাকচার সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করার জন্য ব্যবহৃত হয়। যেকোনো ধরনের পাইথন অবজেক্ট (লিস্ট, ডিক্ট, ইত্যাদি) কে বাইট স্ট্রিম (0 এবং 1) এ রূপান্তর করার প্রক্রিয়াকে পিকলিং বা সিরিয়ালাইজেশন বা ফ্ল্যাটেনিং বা মার্শালিং বলা হয়। পিকলিং এর মাধ্যমে জেনারেট করা বাইট স্ট্রিমকে আবার পাইথন অবজেক্টে রূপান্তর করার প্রক্রিয়াকে আনপিকলিং (unpickling) বলা হয়।
একটি অবজেক্ট পিকল করতে আমাদের শুধু করতে হবে:
- পিকল ইম্পোর্ট করুন
- dumps() ফাংশন কল করুন
import pickle
class Vehicle:
def __init__(self, number_of_doors, color):
self.number_of_doors = number_of_doors
self.color = color
class Car(Vehicle):
def __init__(self, color):
Vehicle.__init__(self, 5, color)
Maruti = Car('Red')
print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))
pickle_Maruti = pickle.dumps(Maruti)
print('Here is my pickled Vehicle: ')
print(pickle_Maruti)
আউটপুট
My Vehicle Maruti is Red and has 5 doors Here is my pickled Vehicle: b'\x80\x03c__main__\nCar\nq\x00)\x81q\x01}q\x02(X\x0f\x00\x00\x00number_of_doorsq\x03K\x05X\x05\x00\x00\x00colorq\x04X\x03\x00\x00\x00Redq\x05ub.'
উপরের উদাহরণে, আমরা Car ক্লাসের একটি ইন্সট্যান্স তৈরি করেছি এবং তারপর সেটি পিকল করেছি, আমাদের কার ইন্সট্যান্সকে বাইটের একটি সিম্পল অ্যারে-তে রূপান্তর করেছি। আমাদের কার ইন্সট্যান্স পিকল হওয়ার পর, আমরা সহজে সেটি একটি বাইনারি ফাইলে বা ডিবি ফিল্ডে সংরক্ষণ করতে পারি এবং পরে সেটি রিস্টোর করে বাইটের এই গুচ্ছকে আবার একটি অবজেক্ট হায়ারার্কিতে রূপান্তর করতে পারি।
নোট: যদি আমরা একটি পিকলড অবজেক্ট সহ ফাইল তৈরি করতে চাই, তবে dumps() মেথডের বদলে dump() মেথড ব্যবহার করতে হবে।
আনপিকলিং (Unpickling)
এটি পিকলিং-এর বিপরীত (বা ইনভার্স) অপারেশন, যেখানে আমরা বাইনারি স্ট্রিম নেই এবং সেটিকে একটি অবজেক্ট হায়ারার্কিতে রূপান্তর করি।
আনপিকলিং pickle মডিউলের load() ফাংশন ব্যবহার করে করা হয় এবং বাইট স্ট্রিম থেকে একটি সম্পূর্ণ অবজেক্ট হায়ারার্কি ফেরত দেয়।
নিচে load দেওয়া হলো:
import pickle
class Vehicle:
def __init__(self, number_of_doors, color):
self.number_of_doors = number_of_doors
self.color = color
class Car(Vehicle):
def __init__(self, color):
Vehicle.__init__(self, 5, color)
Maruti = Car('Red')
print(str.format('My Vehicle Maruti is {0} and has {1} doors', Maruti.color, Maruti.number_of_doors))
pickle_Maruti = pickle.dumps(Maruti)
# এখন, আমাদের কার Maruti আনপিকল করি অন্য একটি ইন্সট্যান্স, অন্য একটি কার তৈরি করে...
unpickle_Maruti = pickle.loads(pickle_Maruti)
# আমাদের নতুন ইন্সট্যান্সের অন্য রং সেট করি
Hyundai = unpickle_Maruti
Hyundai.color = 'Black'
print(str.format("Hyundai is {0} ", Hyundai.color))
print(str.format("Maruti is {0} ", Maruti.color))
উপরের উদাহরণে, আপনি দেখতে পাচ্ছেন যে আমরা আমাদের প্রথম কার অবজেক্ট (Maruti) পিকল করেছি এবং তারপর সেটি অন্য একটি ভেরিয়েবল (Hyundai) এ আনপিকল করেছি এবং তাই আমরা একটি অনুভূতিতে Maruti-কে ক্লোন করে Hyundai তৈরি করেছি।
আউটপুট
My Vehicle Maruti is Red and has 5 doors Hyundai is Black Maruti is Red
পিকল বনাম JSON
JSON বলতে জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন, ডেটা-ইন্টারচেঞ্জের জন্য একটি লাইটওয়েট ফরম্যাট এবং মানব-पাঠযোগ্য। পিকলের ওপর JSON-এর একটি বড় সুবিধা হলো এটি স্ট্যান্ডার্ডাইজড এবং ল্যাঙ্গুয়েজ-ইনডিপেন্ডেন্ট। এটি পিকলের চেয়ে অনেক বেশি সিকিউয়ার এবং ফাস্ট।
পিকলের আরেকটি অ্যাল্টারনেটিভ হলো cPickle, যা পিকলের মতই কিন্তু C ল্যাঙ্গুয়েজে লেখা এবং ১০০০ গুণ দ্রুত। আপনি পিকল এবং cPickle-এর জন্য একই ফাইল ব্যবহার করতে পারেন।
import json
mylist = [2, 4, 5, "ab", "cd", "ef"]
print("Here is my list: ", mylist)
json_string = json.dumps(mylist)
print("Here is my json encoded object: ", json_string)
print("Here is JSON back to a data structure: ", json.loads(json_string))
আউটপুট
Here is my list: [2, 4, 5, 'ab', 'cd', 'ef'] Here is my json encoded object: [2, 4, 5, "ab", "cd", "ef"] Here is JSON back to a data structure: [2, 4, 5, 'ab', 'cd', 'ef']
উপরের কোডে, আমরা প্রথমে অবজেক্ট (my list) নিই এবং "dumps" মেথড ব্যবহার করে একটি স্ট্রিং রিটার্ন করি এবং তারপর JSON-কে ডেটা স্ট্রাকচারে ফেরত আনতে "loads" মেথড ব্যবহার করি যা একটি স্ট্রিং নেয় এবং সেটিকে JSON অবজেক্ট ডেটা স্ট্রাকচারে রূপান্তর করে।