क्रमांकन एक ऑब्जेक्ट या डेटा संरचना को एक अनुक्रमिक प्रारूप में बदलने की प्रक्रिया है जो नेटवर्क ट्रांसमिशन या फ़ाइल में संग्रहण के लिए उपयुक्त होता है। विपरीत प्रक्रिया, अक्रमांकन, डेटा को उसकी मूल अवस्था में पुनर्स्थापित करता है। 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, Kotlin Multiplatform Mobile के लिए JetBrains की एक आधुनिक लाइब्रेरी है। यह 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें