Swift (iOS/macOS) में ऑब्जेक्ट सीरियलाइज़ेशन
सीरियलाइज़ेशन जटिल ऑब्जेक्ट्स (स्ट्रक्चर, क्लासेस, इंस्टेंसेस) को स्टोरेज या नेटवर्क ट्रांसमिशन (JSON, Property List, बाइनरी डेटा) के लिए उपयुक्त फॉर्मेट में बदलने की प्रक्रिया है। डीसीरियलाइज़ेशन इसका उल्टा है - डेटा से ऑब्जेक्ट को पुनर्स्थापित करना। iOS और macOS के लिए Swift में दो मुख्य दृष्टिकोण हैं: आधुनिक Codable प्रोटोकॉल (और इसके भाग Encodable और Decodable) और Foundation फ्रेमवर्क का पुराना NSCoding। इस लेख में हम कोड उदाहरणों के साथ दोनों दृष्टिकोणों को विस्तार से समझेंगे।
1. Codable प्रोटोकॉल (अनुशंसित तरीका)
Codable एक प्रोटोकॉल है जो Encodable और Decodable को जोड़ता है। यदि आपकी स्ट्रक्चर या क्लास के सभी प्रॉपर्टी Codable (स्ट्रिंग्स, नंबर्स, डेट्स, ऐरे, डिक्शनरी आदि) के अनुरूप हैं, तो यह स्वचालित रूप से सीरियलाइज़ेशन और डीसीरियलाइज़ेशन के लिए कोड जनरेट करता है।
1.1. JSON में बेसिक सीरियलाइज़ेशन
एक सरल यूज़र स्ट्रक्चर देखें:
import Foundation
struct User: Codable {
let id: Int
var name: String
var email: String
}
// एक इंस्टेंस बनाएं
let user = User(id: 1, name: "राहुल शर्मा", email: "rahul@example.com")
// Data (JSON) में सीरियलाइज़ेशन
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // पढ़ने योग्य आउटपुट के लिए
do {
let jsonData = try encoder.encode(user)
if let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
}
} catch {
print("सीरियलाइज़ेशन त्रुटि: \(error.localizedDescription)")
}
1.2. JSON से डीसीरियलाइज़ेशन
// मान लें हमारे पास एक JSON स्ट्रिंग है
let jsonString = """
{
"id": 2,
"name": "प्रिया सिंह",
"email": "priya@test.com"
}
"""
let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
do {
let decodedUser = try decoder.decode(User.self, from: jsonData)
print("नाम: \(decodedUser.name), ईमेल: \(decodedUser.email)")
} catch {
print("डीसीरियलाइज़ेशन त्रुटि: \(error.localizedDescription)")
}
1.3. कुंजियाँ कस्टमाइज़ करना (CodingKeys)
यदि Swift में प्रॉपर्टी के नाम JSON में कुंजियों से भिन्न हैं, तो CodingKeys एनुम का उपयोग करें:
struct Article: Codable {
var title: String
var body: String
var publicationDate: Date
enum CodingKeys: String, CodingKey {
case title
case body
case publicationDate = "published_at" // JSON में कुंजी
}
}
let articleJSON = """
{"title":"Swift Codable","body":"लेख का टेक्स्ट","published_at":"2024-01-15T10:00:00Z"}
"""
let articleData = Data(articleJSON.utf8)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601 // तारीख सही पार्स करने के लिए
if let article = try? decoder.decode(Article.self, from: articleData) {
print("शीर्षक: \(article.title), तारीख: \(article.publicationDate)")
}
1.4. PropertyListEncoder / PropertyListDecoder
Property List (XML या बाइनरी) फॉर्मेट में सीरियलाइज़ेशन के लिए PropertyListEncoder का उपयोग करें:
let plistEncoder = PropertyListEncoder()
plistEncoder.outputFormat = .xml
if let plistData = try? plistEncoder.encode(user) {
// plistData को फ़ाइल में सेव किया जा सकता है
let plistString = String(data: plistData, encoding: .utf8)
print(plistString ?? "अमान्य डेटा")
}
2. NSCoding प्रोटोकॉल (NSObject से विरासत प्राप्त क्लासेस के लिए)
NSCoding Objective-C का एक प्रोटोकॉल है जो अभी भी क्लासेस, विशेषकर UIKit/AppKit (जैसे UIView, UIViewController) के साथ काम करने वाली क्लासेस के सीरियलाइज़ेशन के लिए उपयोग किया जाता है। इसके लिए क्लास को NSObject से विरासत प्राप्त करनी होती है और encode(with:) और init?(coder:) मेथड्स को लागू करना होता है।
2.1. NSCoding के साथ क्लास का उदाहरण
import Foundation
class Person: NSObject, NSCoding {
var name: String
var age: Int