Serialización de objetos en Swift (iOS/macOS)
La serialización es el proceso de convertir objetos complejos (estructuras, clases, instancias) en un formato adecuado para almacenamiento o transmisión por red (JSON, Property List, datos binarios). La deserialización es el proceso inverso de restaurar el objeto a partir de estos datos. En Swift para iOS y macOS existen dos enfoques principales: el protocolo moderno Codable (y sus componentes Encodable y Decodable) y el más antiguo NSCoding del framework Foundation. En este artículo analizaremos ambos enfoques en detalle con ejemplos de código.
1. Protocolo Codable (método recomendado)
Codable es un protocolo que combina Encodable y Decodable. Permite generar automáticamente código para serialización y deserialización si todas las propiedades de su estructura o clase también cumplen con Codable (cadenas, números, fechas, arreglos, diccionarios, etc.).
1.1. Serialización básica a JSON
Consideremos una estructura simple de usuario:
import Foundation
struct User: Codable { let id: Int var name: String var email: String}
// Creamos una instancialet user = User(id: 1, name: "Iván Petrov", email: "ivan@example.com")
// Serialización a Data (JSON)let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // para salida legible
do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("Error de serialización: \\(error.localizedDescription)")}1.2. Deserialización desde JSON
// Supongamos que tenemos una cadena JSONlet jsonString = """{ "id": 2, "name": "María Smirnova", "email": "maria@test.com"}"""
let jsonData = Data(jsonString.utf8)let decoder = JSONDecoder()
do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("Nombre: \\(decodedUser.name), Email: \\(decodedUser.email)")} catch { print("Error de deserialización: \\(error.localizedDescription)")}1.3. Personalización de claves (CodingKeys)
Si los nombres de las propiedades en Swift difieren de las claves en JSON, use la enumeración 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" // clave en JSON }}
let articleJSON = """{"title":"Swift Codable","body":"Texto del artículo","published_at":"2024-01-15T10:00:00Z"}"""let articleData = Data(articleJSON.utf8)let decoder = JSONDecoder()decoder.dateDecodingStrategy = .iso8601 // para analizar correctamente la fecha
if let article = try? decoder.decode(Article.self, from: articleData) { print("Título: \\(article.title), Fecha: \\(article.publicationDate)")}1.4. PropertyListEncoder / PropertyListDecoder
Para serializar al formato Property List (XML o binario) use PropertyListEncoder:
let plistEncoder = PropertyListEncoder()plistEncoder.outputFormat = .xml
if let plistData = try? plistEncoder.encode(user) { // plistData se puede guardar en un archivo let plistString = String(data: plistData, encoding: .utf8) print(plistString ?? "Datos incorrectos")}2. Protocolo NSCoding (para clases que heredan de NSObject)
NSCoding es un protocolo de Objective-C que todavía se usa para serializar clases, especialmente aquellas que trabajan con UIKit/AppKit (por ejemplo, UIView, UIViewController). Requiere que la clase herede de NSObject e implemente los métodos encode(with:) y init?(coder:).
2.1. Ejemplo de clase con NSCoding
También en la biblioteca
Validación de datos en C# (.NET) con FluentValidation: guía completa
SwiftConfig: Gestión de configuración de aplicaciones en Swift
Procesamiento de imágenes en C++: bibliotecas CImg, OpenCV y Magick++