যদিও পাইথনের স্ট্যান্ডার্ড লাইব্রেরির marshal মডিউল অবজেক্ট সিরিয়ালাইজেশন বৈশিষ্ট্য প্রদান করে (pickle মডিউলের মতো), এটি সাধারণ উদ্দেশ্যের ডেটা পারসিস্টেন্স বা সকেটের মাধ্যমে পাইথন অবজেক্ট ট্রান্সমিশনের জন্য আসলে উপযোগী নয়। এই মডিউল মূলত পাইথন নিজে ব্যবহৃত হয় পাইথন মডিউলের কম্পাইল্ড ভার্সন (.pyc ফাইল)위에 রিড/রাইট অপারেশন সাপোর্ট করার জন্য। marshal মডিউল tarafından ব্যবহৃত ডেটা ফরম্যাট পাইথন ভার্সন জুড়ে কম্প্যাটিবল নয় (সাবভার্সনেও নয়)। তাই একটি পাইথন সংস্করণের কম্পাইল্ড স্ক্রিপ্ট (.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