Objektserialisierung in Swift (iOS/macOS)
\nSerialisierung ist der Prozess der Umwandlung komplexer Objekte (Strukturen, Klassen, Instanzen) in ein Format, das zur Speicherung oder Übertragung über ein Netzwerk geeignet ist (JSON, Property List, Binärdaten). Deserialisierung ist der umgekehrte Prozess der Wiederherstellung eines Objekts aus diesen Daten. In Swift für iOS und macOS gibt es zwei Hauptansätze: das moderne Protokoll Codable (und seine Bestandteile Encodable und Decodable) sowie das ältere NSCoding aus dem Foundation-Framework. In diesem Artikel werden wir beide Ansätze mit Codebeispielen im Detail erläutern.
1. Das Codable-Protokoll (empfohlener Weg)
\nCodable ist ein Protokoll, das Encodable und Decodable vereint. Es ermöglicht die automatische Generierung von Code für Serialisierung und Deserialisierung, wenn alle Eigenschaften Ihrer Struktur oder Klasse ebenfalls Codable entsprechen (Zeichenketten, Zahlen, Daten, Arrays, Wörterbücher usw.).
1.1. Grundlegende Serialisierung in JSON
\nBetrachten wir eine einfache Benutzerstruktur:
\nimport Foundation\n\nstruct User: Codable {\n let id: Int\n var name: String\n var email: String\n}\n\n// Erstellen einer Instanz\nlet user = User(id: 1, name: "Ivan Petrov", email: "ivan@example.com")\n\n// Serialisierung in Data (JSON)\nlet encoder = JSONEncoder()\nencoder.outputFormatting = .prettyPrinted // für lesbare Ausgabe\n\ndo {\n let jsonData = try encoder.encode(user)\n if let jsonString = String(data: jsonData, encoding: .utf8) {\n print(jsonString)\n }\n} catch {\n print("Serialisierungsfehler: \\(error.localizedDescription)")\n}\n\n\n1.2. Deserialisierung aus JSON
\n// Angenommen, wir haben einen JSON-String\nlet jsonString = """\n{\n "id": 2,\n "name": "Maria Smirnova",\n "email": "maria@test.com"\n}\n"""\n\nlet jsonData = Data(jsonString.utf8)\nlet decoder = JSONDecoder()\n\ndo {\n let decodedUser = try decoder.decode(User.self, from: jsonData)\n print("Name: \\(decodedUser.name), Email: \\(decodedUser.email)")\n} catch {\n print("Deserialisierungsfehler: \\(error.localizedDescription)")\n}\n\n\n1.3. Anpassung von Schlüsseln (CodingKeys)
\nWenn die Eigenschaftsnamen in Swift von den Schlüsseln in JSON abweichen, verwenden Sie die Aufzählung CodingKeys:
struct Article: Codable {\n var title: String\n var body: String\n var publicationDate: Date\n\n enum CodingKeys: String, CodingKey {\n case title\n case body\n case publicationDate = "published_at" // Schlüssel in JSON\n }\n}\n\nlet articleJSON = """\n{"title":"Swift Codable","body":"Artikeltext","published_at":"2024-01-15T10:00:00Z"}\n"""\nlet articleData = Data(articleJSON.utf8)\nlet decoder = JSONDecoder()\ndecoder.dateDecodingStrategy = .iso8601 // für korrektes Parsen des Datums\n\nif let article = try? decoder.decode(Article.self, from: articleData) {\n print("Titel: \\(article.title), Datum: \\(article.publicationDate)")\n}\n\n\n1.4. PropertyListEncoder / PropertyListDecoder
\nFür die Serialisierung in das Property-List-Format (XML oder binär) verwenden Sie PropertyListEncoder:
let plistEncoder = PropertyListEncoder()\nplistEncoder.outputFormat = .xml\n\nif let plistData = try? plistEncoder.encode(user) {\n // plistData kann in einer Datei gespeichert werden\n let plistString = String(data: plistData, encoding: .utf8)\n print(plistString ?? "Ungültige Daten")\n}\n\n\n2. Das NSCoding-Protokoll (für von NSObject abgeleitete Klassen)
\nNSCoding ist ein Protokoll aus Objective-C, das immer noch zur Serialisierung von Klassen verwendet wird, insbesondere solcher, die mit UIKit/AppKit arbeiten (z. B. UIView, UIViewController). Es erfordert, dass die Klasse von NSObject erbt und die Methoden encode(with:) und init?(coder:) implementiert.
2.1. Beispiel einer Klasse mit NSCoding
\nAuch in der Bibliothek
Aufgabenplaner in Node.js: node-cron, node-schedule und Bull
Arbeiten mit CSV in JavaScript (Node.js): Bibliotheken, Parsing und Datengenerierung
CsvHelper für C# (.NET): Komplettguide mit Beispielen