এক недавী প্রজেক্ট আপডেট মিটিং-এ, আমার টিম আলোচনা করেছিল কীভাবে আমরা সিরিয়ালাইজেশন ব্যবহার করব এই অ্যাপ্লিকেশন থেকে ডেটা आगे-পেছে পাঠাতে।
একজন ইঞ্জিনিয়ার যিনি সফটওয়্যার প্রজেক্টে আরও জড়িত হতে চান, সে আমাকে বললেন যে সে এই টার্মটির সাথে অনভিজ্ঞ।
এইরকম এসেনশিয়াল প্রসেসগুলা মিস করা সহজ যেগুলো বড় প্রজেক্টে ডুবতে না পারা পর্যন্ত सामने আসে না। এই ব্যক্তির ক্ষেত্রেও এই ঘটনা ঘটল, যেন একসময় আমার জন্যও।
তাই আমি এটা নিয়ে লিখতে চাইলাম। আমি সেরকম আমার সহকর্মীকে সিরিয়ালাইজেশন শিখাতে পারলাম সেদিন, এবং আপনি আজ সেটি শিখবেন।
সিরিয়ালাইজেশন কী?
সিরিয়ালাইজেশন হলো একটি প্রসেস যেখানে একটি সার্ভিস একটি ডেটা স্ট্রাকচার (যেমন Python-এ একটি ডিকশনারি) নেয়, সেটিকে র্যাপ করে, এবং অন্য একটি সার্ভিসে পাঠায় পড়ার জন্য। এটিই সরল সংজ্ঞা।
কল্পনা করুন আমাকে কাউকে একটি মেসেজ পাঠাতে হচ্ছে। তাই আমি টেক্সটটি একটি ইতিমধ্যে অ্যাসেম্বলড পাজলের উপরে লিখি। আমি টুকরোগুলো আলাদা করি, পাজল পুনরায় অ্যাসেম্বল করার নির্দেশনা যোগ করি, এবং পাঠিয়ে দি।
মেসেজ প্রাপক তারপর পাজলের টুকরোগুলো পায়, সেগুলো আবার একসাথে জোড়া দিয়ে, এবং এখন তাদের কাছে আমার মেসেজ আছে।

টেকনিক্যাল সংজ্ঞা কিছুটা বেশি মজাদার। সিরিয়ালাইজেশন হলো একটি ডেটা অবজেক্টকে বাইট স্ট্রিমে কনভার্ট করার প্রসেস, এবং অবজেক্টের স্টেট সেভ করা যাতে সেটি ডিস্কে স্টোর করা যায় বা নেটওয়ার্ক জুড়ে ট্রান্সমিট করা যায়। এটি স্টোরেজ সাইজ কমায় এবং নেটওয়ার্ক জুড়ে ইনফরমেশন ট্রান্সফার করা সহজ করে।

মার্শালিং এবং সিরিয়ালাইজেশন - পার্থক্য কী?
মার্শালিং প্রসেসটি মনে আসতে পারে। মার্শালিং হলো একটি অবজেক্টের মেমরি রিপ্রেজেন্টেশনকে ট্রান্সমিশনের জন্য উপযুক্ত ফর্মে রূপান্তর করার প্রসেস।
যদিও মার্শালিং এবং সিরিয়ালাইজেশন লูজলি সিনোনিমাস, একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। উদাহরণস্বরূপ, একটি Golang প্রোগ্রাম তৈরি করার সময় JSON ডেটা Golang ডেটা স্ট্রাকচারে পড়ার জন্য, আপনি মার্শালিং ব্যবহার করতে পারেন JSON কি ভ্যালুকে Golang কি ভ্যালুতে ট্রান্সলেট করতে।
পার্থক্য হলো মার্শালিং ডেটা ট্রান্সলেট করার জন্য ব্যবহার হতে পারে। অন্যদিকে, সিরিয়ালাইজেশন ডেটা বাইট স্ট্রিমে পাঠায় বা স্টোর করে এবং সেটিকে তার আসল ফর্মে রি-অ্যাসেম্বল করে। দুটোই সিরিয়ালাইজেশন করে, কিন্তু এই দুটি প্রসেসের ইন্টেন্টে পার্থক্য রয়েছে।
নিচে আমি টুইটার ডেটার সাথে ইন্টারঅ্যাক্ট করার জন্য তৈরি একটি স্ট্রাক্ট দেখাচ্ছি যা মার্শালিং-ইন-অ্যাকশনের একটি উদাহরণ। Golang-এ, আপনি ট্যাগ হিসেবে হিন্ট দিতে পারেন, সহজে এই অবজেক্টকে JSON ডেটাতে কনভার্ট করতে Golang-এর বিল্ট-ইন মার্শালিং সার্ভিস ব্যবহার করে।

এন্ডিয়ানেস কী?
আমি এন্ডিয়ানেস সম্পর্কেও কিছুটা আলাপ করতে চাই। এন্ডিয়ানেস হলো মেমরিতে বাইটের অর্ডার বর্ণনা করার একটি টার্ম।
আপনি মেমরিকে একটি ব্লক হিসেবে চিন্তা করতে পারেন যেখানে ডেটার বাইটগুলো স্টোর থাকে। সিরিয়ালাইজেশনের জন্য কাজ করার হেতু, বাইট স্ট্রিমকে ডেটা টাইপ ট্রান্সফার করতে হবে এক সিস্টেম থেকে অন্য সিস্টেমে পরিবর্তনশীল এন্ডিয়ানেসের বावजूद।
নিচে লিটল এবং বিগ-এন্ডিয়ানের পার্থক্য দেখানো হলো। এটি এসেনশিয়াল যে এন্ডিয়ানেস এক সিস্টেম থেকে অন্য সিস্টেমে ম్యাচ করে অথবা কোনোভাবে কনভার্ট করা হয়, কারণ সব সিস্টেম তাদের বিট একইভাবে অর্ডার করে না।

সিরিয়ালাইজেশনের ইউজ কেস
আমাদের ইউজ কেস এই ফিচারগুলোর পুরোপুরি সুবিধা নেয়। আমরা আমাদের স্ক্যান করা হার্ডওয়্যার থেকে কিছু ইনফরমেশন নিব, সেটিকে বাইট স্ট্রিমে প্যাকেজ করব, এবং নেটওয়ার্ক জুড়ে অন্য একটি সার্ভিসে পাঠাব যেটি ডেটা রিকন্সট্রাক্ট করবে।
সিরিয়ালাইজেশন প্রসেস উল্টো করে ডেটাকেও তার আসল ফর্মে রিকন্সট্রাক্ট করার প্রসেসকে ডিসিরিয়ালাইজেশন বলা হয়।
এইচ่น 아직 অন্যান্য ইউজ কেসও আছে। উদাহরণস্বরূপ, REST API বা AMQP-এর মত মেসেজিং প্রোটোকল সিরিয়ালাইজেশন ব্যবহার করতে পারে ডেটা কম্প্রেস ও পাঠাতে।
AMQP একটি মেসেজিং প্রোটোকল যেখানে আপনি একটি AMQP ব্রোকারে মেসেজ পাঠান, এবং রিসিভিং সার্ভিস এই ব্রোকারকে "লিসেন" করে মেসেজের জন্য। ব্যাকএন্ড ইঞ্জিনিয়াররা এটিকে ভালোভাবে জানেন, কারণ ডিস্ট্রিবিউটেড সিস্টেমে ডেটা आगे-পেছে পাঠাতে এটি প্রায়শই ব্যবহৃত হয়।
অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজ সহজে সিরিয়ালাইজেশন স্পিন আপ করার ক্ষমতা রেখেছে। তাই এটি একটি ল্যাঙ্গুয়েজ-অগনস্টিক টপিক।
সিরিয়ালাইজেশন উদাহরণ
চলুন একটি কুইক উদাহরণ দেই। এই কোড লাইব্রেরি kombu ব্যবহার করে AMQP দিয়ে মেসেজ পাঠাতে। আমরা এটি ব্যবহার করছি একটি সফটওয়্যার প্যাকেজ থেকে অন্যটিতে নেটওয়ার্ক জুড়ে মেসেজ পাঠাতে। এই কোডটি একটি সার্ভিসের জন্য যা AMQP ব্রোকারে মেসেজ পাঠাচ্ছে:
def send_message(self, payload, sender_serializer): ... try: producer.publish( {'payload': message}, ... serializer = 'json', ... ) return publish মেথডটি লক্ষ্য করুন। আমরা সিরিয়ালাইজেশন মেথডটি আর্গুমেন্ট হিসেবে পাস করছি যাতে লাইব্রেরি জানে আমরা যে ডেটা পাস করছি সেটিকে কীভাবে সিরিয়ালাইজ করতে হবে।
ডেটা মেসেজটি বাইটের স্ট্রিমে কনভার্ট হয়, যা আপনি দেখলে লম্বা একটি লেটার ও নাম্বার স্ট্রিংর মতো লাগবে, এবং আমরা মেসেজটি পাঠিয়ে দিই।
সংশ্লিষ্ট সার্ভিস একই সিরিয়ালাইজেশন মেথড ব্যবহার করে ডেটাকে তার আসল স্টেটে রিকন্সট্রাক্ট করবে। এটি একটি গুরুত্বপূর্ণ ফিচার কারণ আমরা একটি টুল সьюইট তৈরি করছি যাদের একে অপরের সাথে মেসেজ পাঠাতে হবে একে অপরের সাথে কাজ করার জন্য।
সিরিয়ালাইজেশন ডেটা ফরম্যাট
যখন কাজের ডিমান্ড করে, আমি সিরিয়ালাইজেশনের জন্য JSON ব্যবহার করি। যাইহোক, আপনি কিছু অন্যও ব্যবহার করতে পারেন।
JSON-এ অনেক ওভারহেড আছে, কিন্তু হিউম্যান রিডেবিলিটি এটিকে আমার জন্য আইডিয়াল করে দিয়েছে। আপনি Protobufs, YAML, বা XMLও ব্যবহার করতে পারেন। এগুলো শুধু কিছু ডেটা অবজেক্ট ফরম্যাট যা আপনি ব্যবহার করতে পারেন।
উপসংহার
আমি খুশি যে আমি আমার সিস্টেম থেকে এটি বের করে ফেললাম। আমি এর চিন্তা বন্ধ করলাম, এবং আশা করি কেউ কিছু শিখলো।
সিরিয়ালাইজেশন এসেনশিয়াল হয়ে যায় যখন আপনি আপনার কমিউনিকেশন পাইপলাইন একসাথে বসাচ্ছেন। এই টপিক সম্পর্কে জানা ভালো যাতে আপনি যেকোনো টুলকে প্রপার ব্যাকগ্রাউন্ড নলেজ দিয়ে আত্মবিশ্বাসের সাথে অপ্রোচ করতে পারেন।
—জর্জ