سیریلائزیشن اور ڈی سیریلائزیشن اشیاء کو ترسیل یا ذخیرہ کرنے کے لیے فارمیٹ میں تبدیل کرنے کے بنیادی عمل ہیں۔ موبائل ڈویلپمنٹ میں، یہ میکانزم ہر نیٹ ورک درخواست، حالت محفوظ کرنے اور بین العمل مواصلات میں استعمال ہوتے ہیں۔ MDN Web Docs, 2024 کے مطابق، JSON ویب اور موبائل ایپلیکیشنز میں سیریلائزیشن کا سب سے مقبول فارمیٹ ہے، جو XML اور Protocol Buffers سے آگے ہے۔
اہم نکات
سیریلائزیشن ایک ایپلیکیشن شے کو نیٹ ورک ترسیل یا ڈسک ذخیرہ کرنے کے لیے موزوں فارمیٹ میں تبدیل کرنے کا عمل ہے۔ ڈی سیریلائزیشن موصولہ ڈیٹا سے شے کو بحال کرتے ہوئے الٹ تبدیلی انجام دیتی ہے۔ موبائل ڈویلپمنٹ میں، سیریلائزیشن API درخواستوں، اسکرین کی حالت محفوظ کرنے، کیشنگ اور Intent یا Bundle کے ذریعے ڈیٹا کی منتقلی میں استعمال ہوتی ہے۔
ایپلیکیشن کے اجزاء کے درمیان یا ایپلیکیشن اور سرور کے درمیان کسی بھی تعامل کے لیے سیریلائزیشن کی ضرورت ہوتی ہے۔ REST APIs 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) JavaScript آبجیکٹ نحو پر مبنی ایک ہلکا پھلکا متنی فارمیٹ ہے۔ 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) اعلی کارکردگی والے نظاموں کے لیے Google کے ذریعے تیار کردہ ایک بائنری سیریلائزیشن فارمیٹ ہے۔ JSON کے برعکس، protobuf کو .proto فائل میں پہلے سے متعین اسکیما کی ضرورت ہوتی ہے، لیکن یہ نمایاں طور پر چھوٹا ڈیٹا سائز اور زیادہ پروسیسنگ رفتار فراہم کرتا ہے۔ فارمیٹ gRPC، Firebase Firestore اور Google کی داخلی خدمات میں استعمال ہوتا ہے۔
ایک 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 APIs اور مائیکرو سروس آرکیٹیکچر کے لیے، JSON بہترین انتخاب ہے — یہ تمام پلیٹ فارمز اور زبانوں کے ذریعے تعاون یافتہ ہے۔ زیادہ بوجھ والے نظاموں اور محدود بینڈوڈتھ والی موبائل ایپلیکیشنز کے لیے، Protocol Buffers ترجیحی ہیں، جو چھوٹا سائز اور تیز ڈی سیریلائزیشن فراہم کرتے ہیں۔ XML صرف کنفیگریشن منظرناموں میں اور لیگیسی سسٹمز کے ساتھ انضمام میں جائز ہے۔ جدید پروجیکٹس میں FlatBuffers کی مقبولیت بھی بڑھ رہی ہے — ایک بائنری فارمیٹ جس میں ڈی سیریلائزیشن کا مرحلہ نہیں ہے، جو گیم انجنوں اور کم سے کم تاخیر والی ایپلیکیشنز میں استعمال ہوتا ہے۔ ہر فارمیٹ کا اپنے شعبہ ہے اور صحیح انتخاب براہ راست ایپلیکیشن کی رفتار اور استعمال شدہ ٹریفک کے حجم کو متاثر کرتا ہے۔
اکثر پوچھے گئے سوالات
سیریلائزیشن ایپلیکیشن شے کو ایسی فارمیٹ میں پیکج کرنا ہے جسے نیٹ ورک پر بھیجا جا سکے یا فائل میں محفوظ کیا جا سکے۔ تصور کریں کہ آپ کسی چیز کی تصویر لیتے ہیں — تصویر سیریلائزیشن ہے اور تصویر سے چیز کو بحال کرنا ڈی سیریلائزیشن ہے۔
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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں