Sérialisation d'objets en Swift : Codable, NSCoding et JSONEncoder

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sérialisation d'objets en Swift (iOS/macOS)

\n

La 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.

\n\n

1. Protocole Codable (méthode recommandée)

\n

Codable 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.).

\n\n

1.1. Sérialisation de base en JSON

\n

Considérons une structure utilisateur simple :

\n
import 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\n

1.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\n

1.3. Personnalisation des clés (CodingKeys)

\n

Si les noms des propriétés en Swift diffèrent des clés dans le JSON, utilisez l'énumération CodingKeys :

\n
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\n

1.4. PropertyListEncoder / PropertyListDecoder

\n

Pour la sérialisation au format Property List (XML ou binaire), utilisez PropertyListEncoder :

\n
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\n

2. Protocole NSCoding (pour les classes héritant de NSObject)

\n

NSCoding 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:).

\n\n

2.1. Exemple de classe avec NSCoding

\n
                    

Recommendations