সিরিয়ালাইজেশন হল একটি অবজেক্ট বা ডেটা গঠনকে একটি ধারাবাহিক ফরম্যাটে রূপান্তর করার প্রক্রিয়া যা নেটওয়ার্ক ডাটা প্রেরণ বা ফাইলে সংরক্ষণের জন্য উপযুক্ত। বিপরীত প্রক্রিয়া, ডিসিরিয়ালাইজেশন, ডেটাকে এর মূল অবস্থায় ফিরিয়ে আনে। MDN Web Docs অনুযায়ী, যে কোনো আন্তর্-প্রক্রিয়া যোগাযোগের জন্য সিরিয়ালাইজেশন অপরিহার্য। সিরিয়ালাইজেশন REST API, ক্যাচিং এবং অ্যাপলিকেশন উপাদানগুলির মধ্যে ডেটা আদানপ্রদানের ভিত্তি নির্মাণ করে।
মূখ্য বিষয়
সিরিয়ালাইজেশন হল RAM-এ থাকা একটি অবজেক্টকে বাইট বা অক্ষরের একটি রৈখিক ধারায় রূপান্তর করার প্রক্রিয়া যা নেটওয়ার্কের উপর প্রেরণ, ফাইলে সংরক্ষণ বা অন্য প্রক্রিয়ায় পাঠানো যেতে পারে। সিরিয়ালাইজেশন ছাড়া, নেটওয়ার্ক যোগাযোগ, অবস্থা সংরক্ষণ এবং আন্তর্-প্রক্রিয়া মিথস্থাপন অসম্ভব হবে।
সিরিয়ালাইজেশনে দুটি বিপরীত প্রক্রিয়া অন্তর্ভুক্ত। সমমুখী প্রক্রিয়া (সিরিয়ালাইজেশন) ডেটাকে প্রেরণের জন্য ফরম্যাটে প্যাক করে। বিপরীত প্রক্রিয়া (ডিসিরিয়ালাইজেশন) ডেটাকে আবার অবজেক্টে ফিরিয়ে আনে। ডিসিরিয়ালাইজেশন নিরাপত্তার জন্য গুরুত্বপূর্ণ: ভুল ইনপুট ডেটা অ্যাপলিকেশনে দুর্বলতা সৃষ্টি করতে পারে।
মোবাইল অ্যাপলিকেশন ডেভেলপমেন্টে, সিরিয়ালাইজেশন সর্বত্র ব্যবহৃত হয়: সার্ভারে অনুরোধ পাঠানো এবং প্রতিসাদন প্রক্রিয়াকরণ, স্ক্রিন ঘূরনে অ্যাপলিকেশনের অবস্থা সংরক্ষণ, ডিস্কে ডেটা ক্যাচিং, এবং Intent (Android) বা Segue (iOS) ব্যবহার করে স্ক্রিনের মধ্যে ডেটা স্থানান্তর।
সিরিয়ালাইজেশন ফরম্যাট গুলি টেক্সট এবং বাইনারিতে বিভক্ত। টেক্সট ফরম্যাট (JSON, XML) মানব-পঠনীয় এবং দেখার জন্য কোনো টুলের প্রয়োজন নেই। বাইনারি ফরম্যাট (Protobuf, FlatBuffers, MessagePack) আরও সংক্ষিপ্ত এবং দ্রুত কিন্তু ডিসিরিয়ালাইজেশন ছাড়া অপঠনীয়। ফরম্যাট পছন্দ কার্যদক্ষতা এবং ডিবাগিং সুবিধার মধ্যে একটি সমঝৌতা।
JSON, XML এবং Protobuf ছাড়াও, বিশেষায়িত ফরম্যাট রয়েছে: Google-এর FlatBuffers গেম্স এবং AR-এর জন্য, MessagePack — JSON-এর একটি সংক্ষিপ্ত বাইনারি বিকল্প, Apache-এর Avro Kafka-তে বিগ ডেটার জন্য, YAML — মন্তব্য সমর্থন সহ একটি কনফিগারেশন ফরম্যাট।
| ফরম্যাট | ধরন | স্কিমা | আকার | গতি |
|---|---|---|---|---|
| JSON | টেক্সট | ঐচ্ছিক | মধ্যম | মধ্যম |
| XML | টেক্সট | XSD | বড় | কম |
| Protobuf | বাইনারি | বাধ্যবাধকমূলক | ছোট | উচ্চ |
| FlatBuffers | বাইনারি | বাধ্যবাধকমূলক | ছোট | সর্বোচ্চ |
| MessagePack | বাইনারি | না | ছোট | উচ্চ |
| Avro | বাইনারি | JSON Schema | ছোট | উচ্চ |
মোবাইল প্লেটফর্মে সিরিয়ালাইজেশনযার নিজস্ব বৈশিষ্ট্য রয়েছে: সীমিত ট্রাফিক, দুর্বল প্রসেসর এবং স্ক্রিন ঘূরনে অবস্থা সংরক্ষণের প্রয়োজন। Android-এ Gson, Moshi, Kotlinx Serialization ব্যবহৃত হয়। iOS-এ — Codable, JSONSerialization, PropertyListEncoder। সঠিক লাইব্রেরি পছন্দ অ্যাপলিকেশনের কার্যদক্ষতাকে গুরুতরভাবে প্রভাবিত করে।
Kotlinx Serialization হল JetBrains-এর একটি আধুনিক লাইব্রেরি Kotlin Multiplatform Mobile-এর জন্য। এটি JSON, Protobuf, CBOR এবং কাস্টম ফরম্যাট সমর্থন করে। Kotlin Serialization প্লাগইনের মাধ্যমে কম্পাইল সময় কোড জেনারেশন হয়, যা রিফলেক্শন ব্যবহার না করে উচ্চ কার্যদক্ষতা নিশ্চিত করে।
Kotlinx Serialization লাইব্রেরি ক্লাসের জন্য @Serializable অ্যানোটেশন এবং সিরিয়ালাইজার জেনারেট করার জন্য একটি কম্পাইলার প্লাগইন ব্যবহার করে। এটি উচ্চ কার্যদক্ষতা এবং টাইপ নিরাপত্তা নিশ্চিত করে। ডিফল্ট ফরম্যাট হল JSON, কিন্তু অন্য ফরম্যাট অতিরিক্ত মডিউলের মাধ্যমে সমর্থিত।
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
@Serializable
data class Project(
val id: Int,
val name: String,
val platforms: List<String>,
val active: Boolean
)
val json = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
}
fun main() {
val project = Project(1, "MobileApp",
listOf("Android", "iOS"), true)
// সিরিয়ালাইজেশন
val jsonString = json.encodeToString(project)
// ডিসিরিয়ালাইজেশন
val restored = json.decodeFromString<Project>(jsonString)
}
Codable প্রোটোকল হল Swift-এর বিল্ট-ইন সিরিয়ালাইজেশন প্রক্রিয়া। এটি Encodable (সিরিয়ালাইজেশন) এবং Decodable (ডিসিরিয়ালাইজেশন) প্রোটোকল একত্রিত করে। JSONEncoder এবং JSONDecoder স্বচালিতভাবে নেস্টেড গঠন, অ্যারে, অপশনাল মান এবং CodingKeys-এর মাধ্যমে কাস্টম কি হ্যান্ডল করে।
import Foundation
struct AppConfig: Codable {
let appName: String
let version: String
let features: [String]
let isProduction: Bool
}
let config = AppConfig(
appName: "MyApp",
version: "2.1.0",
features: ["push", "analytics", "offline"],
isProduction: true
)
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
guard let data = try? encoder.encode(config) else { return }
let jsonString = String(data: data, encoding: .utf8)
সিরিয়ালাইজেশন ফরম্যাটের কার্যদক্ষতা তিনটি মেট্রিক্সে মূল্যায়ন করা হয়: বার্তার আকার, সিরিয়ালাইজেশন গতি এবং ডিসিরিয়ালাইজেশন গতি। মোবাইল অ্যাপলিকেশনের জন্য, তিনটিই গুরুত্বপূর্ণ: আকার ট্রাফিক এবং লোড সময়কে প্রভাবিত করে, গতি ইন্টারফেসের প্রতিসাদশীলতা এবং অ্যাপলিকেশন শুরুর সময়কে প্রভাবিত করে।
Protobuf এবং FlatBuffers বাইনারি উপস্থাপনের কারণে সর্বোত্তম ফলাফল দেখায়। FlatBuffers আলাদা কারণ এটির একটি পৃথক ডিসিরিয়ালাইজেশন ধাপের প্রয়োজন নেই — ডেটা সরাসরি বাইনারি বাফার থেকে পড়া হয়, যা এটিকে সর্বনিম্ন বিলম্ব প্রয়োজনীয় গেম্স এবং AR অ্যাপলিকেশনের জন্য আদর্শ করে তোলে। JSON, খারাপ কার্যদক্ষতা সত্ত্বেও, সরলতা এবং সার্বত্রিকতার কারণে REST API-এর জন্য সবচেয়ে জনপ্রিয় ফরম্যাট রয়েছে।
| পরিদৃশ্য | সুপারিশিত ফরম্যাট | কারণ |
|---|---|---|
| REST API | JSON | সার্বত্রিকতা, পঠনীয়তা, সমর্থন |
| মাইক্রোসার্ভিস | Protobuf | সংক্ষিপ্ততা, গতি, gRPC |
| গেম্স / AR | FlatBuffers | Zero-copy, সর্বনিম্ন বিলম্ব |
| বিগ ডেটা | Avro | Kafka এবং Hadoop-এর সাথে সামঞ্জস্য |
| কনফিগারেশন | YAML | মন্তব্য, পঠনীয়তা |
| Android লেআউট | XML | প্লেটফর্ম মানক |
1000 ব্যবহারকারী অবজেক্টের একটি ডেটাসেটে ব্যাবহারিক পরীক্ষণ দেখায়: Protobuf 12 KB বার্তা তৈরি করে (JSON — 85 KB, XML — 120 KB)। সিরিয়ালাইজেশন সময়: Protobuf — 2 মিলিসেকেন্ড, JSON — 8 মিলিসেকেন্ড, XML — 25 মিলিসেকেন্ড। এই সংখ্যাগুলি বাইনারি ফরম্যাটগুলিকে উচ্চ-লোড সিস্টেম এবং সীমিত ট্রাফিক সহ মোবাইল অ্যাপলিকেশনের জন্য পছন্দসিদ্ধ করে তোলে।
উদাহরণ গুলি বিভিন্ন ফরম্যাটে একটি অবজেক্টের সিরিয়ালাইজেশন প্রদর্শন করে। এটি আকার এবং পঠনীয়তা দৃশ্যভাবে তুলনা করতে সাহায্য করে। একটি User অবজেক্টকে JSON, XML এবং Protobuf-এ সিরিয়ালাইজেন করা হবে — স্পষ্টভাবে দেখা যায় যে JSON, XML অপেক্ষা আরও সংক্ষিপ্ত, এবং Protobuf সবচেয়ে সংক্ষিপ্ত এবং অপঠনীয়।
JSON — সর্বনিম্ন সিনট্যাক্স, কোটেশনে কি, বিভিন্ন ধরনের মান। 80 অক্ষর নেয়। পঠনীয়তা উচ্চ, দৃশ্য গঠন পরিষ্কার। সেই API-এর জন্য উপযুক্ত যেখানে ডেভেলপমেন্ট এবং ডিবাগিং গতি গুরুত্বপূর্ণ।
XML — প্রতিটি উপাদান খোলা এবং বন্ধ করার ট্যাগে মুড়িয়ে থাকে। 150 অক্ষর নেয়। পঠনীয়তা মধ্যম, গঠন কড়া। ডকুমেন্ট ওয়ার্কফ্লো এবং XSD যাচাই প্রয়োজনীয় সিস্টেমের জন্য উপযুক্ত।
Protobuf — বাইনারি, এই ডেটার জন্য 32 বাইট। অপঠনীয় — দেখার জন্য ডিসিরিয়ালাইজেশন প্রয়োজন। সর্বনিম্ন আকার এটিকে উচ্চ-লোড সিস্টেম এবং মোবাইল অ্যাপলিকেশনের জন্য আদর্শ করে তোলে।
{
"id": 42,
"name": "IT Sectr",
"email": "team@itsectr.com",
"role": "admin",
"active": true
}
<user>
<id>42</id>
<name>IT Sectr</name>
<email>team@itsectr.com</email>
<role>admin</role>
<active>true</active>
</user>
সর্বোত্তম অভ্যাস সাধারণ ভুল এড়াতে এবং প্রজেক্টের জন্য সঠিক সিরিয়ালাইজেশন কৌশল বাছার্তে সাহায্য করে। এই সুপারিশগুলি অনুসরণ করা কার্যদক্ষতা, নিরাপত্তা এবং কোড রক্ষণাবেক্ষণ উন্নত করে।
সিরিয়ালাইজেশন নিরাপত্তা একটি অত্যন্ত গুরুত্বপূর্ণ দিক, বিশেষ করে অবিশ্বস্ত উৎস থেকে ডাটা ডিসিরিয়ালাইজ করার সময়। ডিসিরিয়ালাইজেশন আক্রমণ রিমোট কোড এক্সিকিউশন (RCE) ডাকাতে পারে, যা ওয়েব এবং মোবাইল অ্যাপলিকেশনের একটি বিপদজনক দুর্বলতা। সবচেয়ে পরিচিত ঘটনাগুলি Java Serializable এবং Python pickle-এর সাথে সম্পর্কিত।
Protobuf এবং JSON-এর এমন আক্রমণের বিরুদ্ধে বিল্ট-ইন সুরক্ষা রয়েছে, কারণ তারা কেবল ডেটা নিয়ে কাজ করে, এলোচনাহীন অবজেক্ট নয়। অপরদিকে, Java Serializable classpath-এ উপলব্ধ যে কোনো ক্লাস পুনরুদ্ধার করতে পারে, যা বাহ্যিক উৎস থেকে ডেটা গ্রহণের জন্য বিপদজনক করে তোলে। Android-এ, স্ট্যান্ডার্ড Java Serialization-এর পরিবর্তে Kotlinx Serialization বা Moshi ব্যবহার করার পরামর্শ দেওয়া হয়।
অতিরিক্ত নিরাপত্তা ব্যবস্থা: ইনপুট ডেটার আকারের জন্য একটি সীমা নির্ধারণ করুন, ডিসিরিয়ালাইজেশনের পূর্বে স্কিমা যাচাই করুন, HTTP হেডার থেকে Content-Type কে বিশ্বাস করবেন না, অনুমত ক্লাসের জন্য একটি অলোলিস্ট ব্যবহার করুন। নিয়মিতভাবে সিরিয়ালাইজেশন লাইব্রেরি আপডেট করুন, কারণ দুর্বলতা নিয়মিতভাবে আবিষ্কার এবং সমাধান করা হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সিরিয়ালাইজেশন একটি অবজেক্টকে বাইট ক্রমে রূপান্তর করে, যেখানে মার্শালিং ধরন এবং গঠন সংরক্ষণ করে বিভিন্ন ঠিকানার মধ্যে ডেটা স্থানান্তর করে। মার্শালিং-এ সিরিয়ালাইজেশন একটি প্রক্রিয়ার অংশ হিসাবে অন্তর্ভুক্ত থাকে, কিন্তু এটি রিফারেন্স এনকোডিং এবং মেমরি ম্যানেজমেন্টও অন্তর্ভুক্ত করতে পারে।
Google-এর FlatBuffers zero-copy ডিসিরিয়ালাইজেশনের কারণে সর্বোচ্চ গতি প্রদান করে — ডেটা রূপান্তর ছাড়াই সরাসরি বাইনারি বাফার থেকে পড়া হয়। Protobuf দ্বিতীয় স্থানে, JSON তৃতীয় স্থানে। XML সাধারণ ফরম্যাটগুলির মধ্যে সবচেয়ে ধীর।
Kotlinx Serialization Kotlin-এ নতুন প্রজেক্টের জন্য সর্বোত্তম পছন্দ: কম্পাইলার জেনারেশন, Kotlin Multiplatform সমর্থন, null safety। Moshi Java প্রজেক্টের জন্য একটি ভাল পছন্দ, Gson অপেক্ষা আরও কার্যদক্ষ। Gson শুরু করার জন্য সবচেয়ে সরল লাইব্রেরি কিন্তু ধীর এবং রিফলেক্শন ব্যবহার করে।
চক্রিয় রিফারেন্স সিরিয়ালাইজেশনের সময় অসীম পুনরাবৃত্তি সৃষ্টি করে। সমাধান: সরাসরি অবজেক্ট রিফারেন্সের পরিবর্তে ID রিফারেন্স ব্যবহার করুন, বিশেষ সিরিয়ালাইজেশন অডাপ্টার প্রয়োগ করুন (যেমন Jackson-এ @JsonIgnore), বা চক্র দূর করতে ডেটা মডেল পুনর্নির্মাণ করুন।
হ্যাঁ, বিশেষ করে অবিশ্বস্ত ডেটার ডিসিরিয়ালাইজেশন। ডিসিরিয়ালাইজেশন দুর্বলতা রিমোট কোড এক্সিকিউশনের কারণ হতে পারে। সুপারিশ: অবিশ্বস্ত উৎস থেকে ডেটা ডিসিরিয়ালাইজ করবেন না, ডিসিরিয়ালাইজেশনের সময় ক্লাসের একটি অলোলিস্ট ব্যবহার করুন এবং প্রক্রিয়াকরণের আগে ডেটা স্কিমা যাচাই করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন