সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন হল বস্তুকে ট্রান্সমিশন বা স্টোরেজের জন্য ফর্ম্যাটে রূপান্তরের মৌলিক প্রক্রিয়া। মোবাইল ডেভেলপমেন্টে, এই পদ্ধতিগুলি প্রতিটি নেটওয়ার্ক অনুরোধ, অবস্থা সংরক্ষণ এবং আন্তঃপ্রক্রিয়া যোগাযোগে ব্যবহৃত হয়। MDN Web Docs, 2024 অনুসারে, JSON ওয়েব এবং মোবাইল অ্যাপ্লিকেশনে সবচেয়ে জনপ্রিয় ফর্ম্যাট হিসেবে রয়ে গেছে, XML এবং Protocol Buffers-কে ছাড়িয়ে।
মুখ্য বিষয়
সিরিয়ালাইজেশন হল অ্যাপ্লিকেশন বস্তুকে নেটওয়ার্ক ট্রান্সমিশন বা ডিস্ক স্টোরেজের জন্য উপযুক্ত ফর্ম্যাটে রূপান্তরের প্রক্রিয়া। ডিসিরিয়ালাইজেশন প্রাপ্ত ডেটা থেকে বস্তু পুনরুদ্ধার করে বিপরীত রূপান্তর সম্পাদন করে। মোবাইল ডেভেলপমেন্টে, সিরিয়ালাইজেশন API অনুরোধ, স্ক্রিন অবস্থা সংরক্ষণ, ক্যাশিং এবং Intent বা Bundle-এর মাধ্যমে ডেটা স্থানান্তরে ব্যবহৃত হয়।
অ্যাপ্লিকেশন উপাদানগুলির মধ্যে বা অ্যাপ্লিকেশন এবং সার্ভারের মধ্যে যেকোনো মিথস্ক্রিয়ার জন্য সিরিয়ালাইজেশন প্রয়োজন। REST API JSON বা XML-এ ডেটা প্রেরণ করে, gRPC Protocol Buffers ব্যবহার করে এবং Android-এ আন্তঃপ্রক্রিয়া যোগাযোগ Parcelable ব্যবহার করে। সিরিয়ালাইজেশন ছাড়া, প্রক্রিয়া সীমানা পেরিয়ে জটিল বস্তু পাঠানো বা ডাটাবেসে সংরক্ষণ করা অসম্ভব।
// সিরিয়ালাইজেশনের সাধারণ নীতি
data class User(
val id: Int,
val name: String,
val email: String
)
// সিরিয়ালাইজেশন: বস্তু -> JSON
fun serializeUser(user: User): String {
return """{"id":${user.id},"name":"${user.name}","email":"${user.email}"}"""
}
// ডিসিরিয়ালাইজেশন: JSON -> বস্তু
fun deserializeUser(json: String): User? {
// JSON-কে বস্তুতে পার্স করা
return Gson().fromJson(json, User::class.java)
}
| ফর্ম্যাট | আকার | গতি | পাঠযোগ্যতা | টাইপিং |
|---|---|---|---|---|
| JSON | মাঝারি | উচ্চ | উচ্চ | গতিশীল |
| XML | বড় | মাঝারি | উচ্চ | XSD স্কিমা |
| Protocol Buffers | ছোট | খুব উচ্চ | নিম্ন | কঠোর .proto |
| FlatBuffers | ছোট | সর্বোচ্চ | নিম্ন | কঠোর .fbs |
JSON (JavaScript Object Notation) জাভাস্ক্রিপ্ট বস্তু সিনট্যাক্সের উপর ভিত্তি করে একটি লঘু টেক্সট ফর্ম্যাট। JSON স্ট্রিং, সংখ্যা, বুলিয়ান মান, অ্যারে এবং নেস্টেড বস্তু সমর্থন করে, যা মোবাইল অ্যাপ্লিকেশনে বেশিরভাগ ডেটা স্থানান্তর পরিস্থিতি কভার করে। ফর্ম্যাটটি প্ল্যাটফর্ম-স্বাধীন: প্রতিটি ইকোসিস্টেম এর পার্সিংয়ের জন্য অন্তর্নির্মিত সরঞ্জাম সরবরাহ করে।
JSON তার সরলতা এবং বহুমুখীতার কারণে জয়ী হয়। ডেভেলপারের মৌলিক ব্যবহারের জন্য স্কিমার প্রয়োজন নেই — পার্সিংয়ের সময় গঠন গতিশীলভাবে নির্ধারিত হয়। ফর্ম্যাটের পাঠযোগ্যতা ডিবাগিং এবং পরীক্ষাকে সহজ করে: সার্ভার প্রতিক্রিয়া যেকোনো ডেভেলপার টুলে দেখা যায়। উভয় মোবাইল প্ল্যাটফর্মে, JSON তৃতীয়-পক্ষের লাইব্রেরির প্রয়োজন ছাড়াই নেটিভভাবে প্রক্রিয়া করা হয়।
// Codable — Swift-এ নেটিভ JSON সিরিয়ালাইজেশন
struct User: Codable {
let id: Int
let name: String
let email: String
}
let jsonString = """{"id":1,"name":"John","email":"john@test.com"}"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
let user = try! decoder.decode(User.self, from: jsonData)
Protocol Buffers (protobuf) উচ্চ-কার্যক্ষমতা সম্পন্ন সিস্টেমের জন্য গুগল দ্বারা উন্নীত একটি বাইনারি সিরিয়ালাইজেশন ফর্ম্যাট। JSON-এর বিপরীতে, protobuf-এর একটি .proto ফাইলে পূর্বনির্ধারিত স্কিমা প্রয়োজন, তবে উল্লেখযোগ্যভাবে ছোট ডেটা আকার এবং উচ্চতর প্রক্রিয়াকরণ গতি সরবরাহ করে। ফর্ম্যাটটি gRPC, Firebase Firestore এবং গুগলের অভ্যন্তরীণ পরিষেবাগুলিতে ব্যবহৃত হয়।
একটি protobuf স্কিমা টাইপকৃত ফিল্ড সহ বার্তা বর্ণনা করে, প্রতিটির একটি অনন্য নম্বর থাকে। protoc কম্পাইলার লক্ষ্য ভাষায় ক্লাস তৈরি করে যা স্বয়ংক্রিয়ভাবে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন সম্পাদন করে। Protobuf ব্যাকওয়ার্ড সামঞ্জস্য না হারিয়ে ফিল্ড যোগ এবং অপসারণের নিয়মের মাধ্যমে স্কিমা বিবর্তন সমর্থন করে।
// user.proto-তে স্কিমা সংজ্ঞা
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
repeated string roles = 4;
}
// Kotlin-এ উৎপন্ন কোড
val user = UserProto.User.newBuilder()
.setId(1)
.setName("John")
.setEmail("john@test.com")
.build()
val bytes: ByteArray = user.toByteArray()
XML (eXtensible Markup Language) কঠোর গঠন, নামস্থান সমর্থন এবং XSD স্কিমার মাধ্যমে বৈধতা সহ একটি ফর্ম্যাট। XML কম্প্যাক্টনেস এবং পার্সিং গতিতে JSON-এর থেকে পিছিয়ে, তবে Android ডেভেলপমেন্টে লেআউট ফাইল, AndroidManifest, রিসোর্স এবং Gradle কনফিগারেশনের জন্য চাহিদায় রয়ে গেছে। iOS-এ, XML plist ফাইল এবং কিছু লিগ্যাসি পরিষেবায় ব্যবহৃত হয়।
Android XML পার্সিংয়ের তিনটি পদ্ধতি সরবরাহ করে: DOM (সম্পূর্ণ ডকুমেন্ট মেমরিতে লোড করা), SAX (ইভেন্ট-চালিত স্ট্রিমিং পার্সিং) এবং XmlPullParser (একটি হাইব্রিড পদ্ধতি)। XmlPullParser মোবাইল ডিভাইসের জন্য প্রস্তাবিত বিকল্প, কারণ এটি সীমিত মেমরির সাথে দক্ষতার সাথে কাজ করে এবং ডকুমেন্ট পড়ার সাথে সাথে প্রক্রিয়া করতে দেয়।
// Android-এ XmlPullParser
fun parseUserXml(inputStream: InputStream): User? {
val parser = Xml.newPullParser()
parser.setInput(inputStream, Xml.Encoding.UTF_8.name)
var id: Int? = null
var name: String? = null
var email: String? = null
while (parser.next() != XmlPullParser.END_DOCUMENT) {
if (parser.eventType == XmlPullParser.START_TAG
&& parser.name == "email") {
email = parser.nextText()
}
}
return User(id!!, name!!, email!!)
}
প্রতিটি প্ল্যাটফর্ম তার নিজস্ব সিরিয়ালাইজেশন সরঞ্জাম সরবরাহ করে। iOS-এ, প্রাথমিক পদ্ধতি হল JSONEncoder এবং JSONDecoder সহ Codable প্রোটোকল, যেখানে Objective-C NSJSONSerialization ব্যবহার করে। Android Gson, Moshi এবং kotlinx.serialization লাইব্রেরি ব্যবহার করে। আন্তঃপ্রক্রিয়া ডেটা স্থানান্তরের জন্য, Android Parcelable ব্যবহার করে, যেখানে iOS NSKeyedArchiver ব্যবহার করে। Kotlin প্রকল্পগুলি ক্রমবর্ধমানভাবে kotlinx.serialization বেছে নিচ্ছে — JetBrains-এর একটি সমাধান যা মাল্টিপ্ল্যাটফর্ম সমর্থন করে এবং রিফ্লেকশনের উপর নির্ভর করে না, Kotlin কম্পাইলার প্লাগইনের মাধ্যমে কম্পাইল সময়ে সিরিয়ালাইজার তৈরি করে।
Android Intent এবং Bundle-এর জন্য দুটি সিরিয়ালাইজেশন পদ্ধতি সমর্থন করে। Serializable একটি স্ট্যান্ডার্ড Java পদ্ধতি যা রিফ্লেকশন ব্যবহার করে, যার ফলে কম কর্মক্ষমতা হয়। Parcelable একটি Android-নির্দিষ্ট প্রোটোকল যার জন্য writeToParcel এবং createFromParcel পদ্ধতির ম্যানুয়াল বাস্তবায়ন প্রয়োজন, তবে সরাসরি বাইট ম্যানিপুলেশনের কারণে দশগুণ দ্রুত কাজ করে।
// Android-এ Parcelable
@Parcelize
data class UserParcel(
val id: Int,
val name: String,
val email: String
) : Parcelable
// Intent-এর মাধ্যমে স্থানান্তর
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", userParcel)
startActivity(intent)
iOS-এ, কন্ট্রোলারের মধ্যে ডেটা স্থানান্তরের জন্য Data-তে প্রাথমিক সিরিয়ালাইজেশন সহ Codable ব্যবহৃত হয়, যেখানে আন্তঃপ্রক্রিয়া যোগাযোগের জন্য NSKeyedArchiver ব্যবহৃত হয়, যা বস্তুকে বাইনারি Property List ফর্ম্যাটে রূপান্তর করে। আধুনিক SwiftUI প্রকল্পগুলি অ্যাপ্লিকেশন মডিউলের মধ্যে স্থানান্তরের জন্য JSONEncoder-এর মাধ্যমে ডেটা এনকোড করতে পছন্দ করে।
অবিশ্বস্ত ডেটার ভুল ডিসিরিয়ালাইজেশন দুর্বলতার কারণ হতে পারে। সিরিয়ালাইজেশন আক্রমণ Java-তে ওভাররাইড করা readObject পদ্ধতি বা তৃতীয়-পক্ষের লাইব্রেরির অনিরাপদ ডিসিরিয়ালাইজারকে কাজে লাগায়। Android-এ, অবিশ্বস্ত উৎস থেকে ডেটার জন্য Serializable এড়ানো উচিত, পরিবর্তে Parcelable বা ডিসিরিয়ালাইজেশনের পরে সমস্ত ফিল্ডের ম্যানুয়াল বৈধতা ব্যবহার করা উচিত। iOS-এ, JSONDecoder ডিফল্টভাবে প্রকারের ক্ষেত্রে কঠোর, তবে JSONSerialization-এর সাথে কাজ করার সময়, ডেভেলপারদের শর্তসাপেক্ষ কাস্টিংয়ের মাধ্যমে প্রকার পরীক্ষা করা উচিত।
সিরিয়ালাইজেশন ফর্ম্যাট নির্বাচন করার সময়, কর্মক্ষমতা প্রয়োজনীয়তা, ডেটা আকার এবং সামঞ্জস্যতা বিবেচনা করা হয়। REST API এবং মাইক্রোসার্ভিস আর্কিটেকচারের জন্য, JSON সর্বোত্তম পছন্দ হিসাবে রয়ে গেছে — এটি সমস্ত প্ল্যাটফর্ম এবং ভাষা দ্বারা সমর্থিত। উচ্চ-লোড সিস্টেম এবং সীমিত ব্যান্ডউইথের মোবাইল অ্যাপ্লিকেশনের জন্য, Protocol Buffers পছন্দনীয়, যা ছোট আকার এবং দ্রুত ডিসিরিয়ালাইজেশন সরবরাহ করে। XML কেবল কনফিগারেশন পরিস্থিতিতে এবং লিগ্যাসি সিস্টেমের সাথে সংহতকরণের সময় ন্যায্য। আধুনিক প্রকল্পগুলিতে FlatBuffers-এর জনপ্রিয়তা বাড়ছে — একটি বাইনারি ফর্ম্যাট যাতে ডিসিরিয়ালাইজেশন ধাপ নেই, যা গেম ইঞ্জিন এবং ন্যূনতম লেটেন্সি অ্যাপ্লিকেশনে ব্যবহৃত হয়। প্রতিটি ফর্ম্যাটের নিজস্ব ক্ষেত্র রয়েছে এবং সঠিক পছন্দ সরাসরি অ্যাপ্লিকেশনের গতি এবং consumed ট্রাফিকের পরিমাণকে প্রভাবিত করে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সিরিয়ালাইজেশন হল অ্যাপ্লিকেশন বস্তুকে এমন একটি ফর্ম্যাটে প্যাকেজ করা যা নেটওয়ার্কের মাধ্যমে পাঠানো বা ফাইলে সংরক্ষণ করা যেতে পারে। কল্পনা করুন আপনি একটি জিনিসের ছবি তোলেন — ছবিটি হল সিরিয়ালাইজেশন, এবং ছবি থেকে জিনিসটি পুনরুদ্ধার করা হল ডিসিরিয়ালাইজেশন।
JSON একটি টেক্সট ফর্ম্যাট যা মানব-পাঠযোগ্য এবং এর জন্য স্কিমার প্রয়োজন নেই। Protocol Buffers একটি বাইনারি ফর্ম্যাট যার বাধ্যতামূলক স্কিমা (.proto), উল্লেখযোগ্যভাবে ছোট আকার এবং উচ্চতর গতি। Protobuf উচ্চ-লোড সিস্টেমের জন্য নির্বাচিত হয়, JSON সার্বজনীন সামঞ্জস্যের জন্য।
XML কনফিগারেশন ফাইল (AndroidManifest, লেআউট রিসোর্স), জটিল নেস্টিং সহ ডকুমেন্ট এবং XSD-এর মাধ্যমে কঠোর বৈধতা সহ সিস্টেমের জন্য মানক হিসাবে রয়ে গেছে। XML SOAP প্রোটোকল এবং লিগ্যাসি সিস্টেমেও ব্যবহৃত হয় যেখানে নামস্থান সমর্থন প্রয়োজন।
Codable একটি Swift প্রোটোকল যা স্বয়ংক্রিয় সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের জন্য Encodable এবং Decodable-কে একত্রিত করে। কম্পাইলার স্ট্রাকচার বা ক্লাসের সমস্ত বৈশিষ্ট্যের জন্য encode(to:) এবং init(from:) পদ্ধতির বাস্তবায়ন তৈরি করে।
Parcelable Serializable-এর তুলনায় উল্লেখযোগ্যভাবে দ্রুত কাজ করে কারণ এটি রিফ্লেকশন ব্যবহার করে না এবং সরাসরি বাইট স্ট্রিমে ফিল্ড লেখে। আধুনিক ডিভাইসে, পার্থক্য Parcelable-এর পক্ষে 10 গুণ ত্বরণে পৌঁছাতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন