Sérialisation d'objets en Swift (iOS/macOS)
\nLa sérialisation est le processus de conversion d'objets complexes (structures, classes, instances) en un format adapté au stockage ou à la transmission via un réseau (JSON, Property List, données binaires). La désérialisation est le processus inverse de reconstruction de l'objet à partir de ces données. En Swift pour iOS et macOS, il existe deux approches principales : le protocole moderne Codable (et ses composants Encodable et Decodable) et le protocole plus ancien NSCoding du framework Foundation. Dans cet article, nous détaillerons les deux approches avec des exemples de code.
1. Protocole Codable (méthode recommandée)
\nCodable est un protocole qui combine Encodable et Decodable. Il permet de générer automatiquement le code de sérialisation et de désérialisation si toutes les propriétés de votre structure ou classe sont également conformes à Codable (chaînes, nombres, dates, tableaux, dictionnaires, etc.).
1.1. Sérialisation de base en JSON
\nConsidérons une structure utilisateur simple :
\nimport Foundation\n\nstruct User: Codable {\n let id: Int\n var name: String\n var email: String\n}\n\n// Création d'une instance\nlet user = User(id: 1, name: "Иван Петров", email: "ivan@example.com")\n\n// Sérialisation en Data (JSON)\nlet encoder = JSONEncoder()\nencoder.outputFormatting = .prettyPrinted // pour un affichage lisible\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("Erreur de sérialisation : \\(error.localizedDescription)")\n}\n\n\n1.2. Désérialisation depuis JSON
\n// Supposons que nous ayons une chaîne JSON\nlet jsonString = """\n{\n "id": 2,\n "name": "Мария Смирнова",\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("Nom : \\(decodedUser.name), Email : \\(decodedUser.email)")\n} catch {\n print("Erreur de désérialisation : \\(error.localizedDescription)")\n}\n\n\n1.3. Personnalisation des clés (CodingKeys)
\nSi les noms des propriétés en Swift diffèrent des clés dans le JSON, utilisez l'énumération 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" // clé dans le JSON\n }\n}\n\nlet articleJSON = """\n{"title":"Swift Codable","body":"Текст статьи","published_at":"2024-01-15T10:00:00Z"}\n"""\nlet articleData = Data(articleJSON.utf8)\nlet decoder = JSONDecoder()\ndecoder.dateDecodingStrategy = .iso8601 // pour un parsing correct de la date\n\nif let article = try? decoder.decode(Article.self, from: articleData) {\n print("Titre : \\(article.title), Date : \\(article.publicationDate)")\n}\n\n\n1.4. PropertyListEncoder / PropertyListDecoder
\nPour la sérialisation au format Property List (XML ou binaire), utilisez PropertyListEncoder :
let plistEncoder = PropertyListEncoder()\nplistEncoder.outputFormat = .xml\n\nif let plistData = try? plistEncoder.encode(user) {\n // plistData peut être sauvegardé dans un fichier\n let plistString = String(data: plistData, encoding: .utf8)\n print(plistString ?? "Données invalides")\n}\n\n\n2. Protocole NSCoding (pour les classes héritant de NSObject)
\nNSCoding est un protocole d'Objective-C encore utilisé pour la sérialisation des classes, notamment celles qui interagissent avec UIKit/AppKit (par exemple, UIView, UIViewController). Il nécessite que la classe hérite de NSObject et implémente les méthodes encode(with:) et init?(coder:).
2.1. Exemple de classe avec NSCoding
\nAussi dans la bibliothèque
Parsing HTML en Java : meilleures bibliothèques et exemples de code
Travailler avec les archives ZIP en TypeScript : guide complet sur JSZip et adm-zip
Travailler avec Kafka en Swift (iOS/macOS) : bibliothèques, clients et exemples
Journalisation en Kotlin : meilleures bibliothèques et outils de développement
Travailler avec XML en Go (Golang) : la bibliothèque standard encoding/xml