Serialization
সিরিয়ালাইজেশন
In-memory data structure-কে একটা flat, self-contained byte sequence-এ রূপান্তর করা — কারণ pointer/memory address শুধু নিজের process-এর মধ্যেই অর্থবহ। বিপরীত দিক: deserialization।
also: marshalling, encoding, wire format, deserialization
Struct সরাসরি memcpy/fwrite করে “serialize” করা একটা সাধারণ
এবং বিপজ্জনক ভুল — raw memory-তে তিনটা লুকানো সমস্যা থাকে:
padding byte (compiler-বসানো filler, মান undefined — আগের কোনো
allocation-এর garbage থেকে যায়), native byte order (গন্তব্য
মেশিনে ভিন্ন হতে পারে), আর compiler/architecture-নির্দিষ্ট layout
(portable না)।
বাস্তব ঘটনা — EtherLeak (2003): বহু Ethernet driver ছোট packet-এর padding zero দিয়ে না ভরে পুরনো kernel/heap memory দিয়ে ভরত — আক্রমণকারী network থেকেই সেই garbage জড়ো করে sensitive তথ্য পুনর্গঠন করতে পারত।
ফরম্যাটের তিন পরিবার:
| ধরন | গতি | আকার | Schema evolution |
|---|---|---|---|
| Fixed binary | সবচেয়ে দ্রুত | সবচেয়ে ছোট | ভঙ্গুর |
| Self-describing (protobuf, MessagePack) | দ্রুত | ছোট | ভালো (tag skip করা যায়) |
| Text (JSON) | ধীর | বড় | সবচেয়ে নমনীয় |
Struct padding কমানোর কৌশল: field-কে আকার অনুসারে বড় থেকে ছোট সাজালে alignment padding সর্বনিম্ন হয় — প্রায়ই ২৫-৫০% জায়গা বাঁচে, কোনো data না হারিয়ে।
Java Serializable আর Python pickle — দুটোই untrusted data
deserialize করলে arbitrary code execution-এর ঝুঁকি বহন করে, তাই
কখনো অবিশ্বস্ত উৎস থেকে আসা serialized data blindly deserialize
করা উচিত না।