Swift में ऑब्जेक्ट सीरियलाइज़ेशन: Codable, NSCoding और JSONEncoder

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

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                    

अनुशंसाएँ