La serialització i deserialització són processos fonamentals en la programació que permeten convertir objectes en un format que es pot emmagatzemar o transmetre i després reconstruir-los. En Objective-C, aquests processos són especialment útils per a la gestió de dades, la comunicació entre aplicacions i la persistència d'objectes.
Què és la Serialització?
La serialització és el procés de convertir un objecte en una seqüència de bytes que es pot emmagatzemar en un arxiu, enviar a través d'una xarxa o guardar en una base de dades. Aquest procés permet que l'estat de l'objecte es preservi i es pugui reconstruir més tard.
Avantatges de la Serialització
- Persistència: Emmagatzemar l'estat d'un objecte per a ús futur.
- Comunicació: Enviar objectes a través de xarxes.
- Còpies de Seguretat: Crear còpies de seguretat de l'estat d'un objecte.
Què és la Deserialització?
La deserialització és el procés invers de la serialització. Consisteix a convertir una seqüència de bytes en un objecte. Això permet reconstruir l'objecte original amb el seu estat complet.
Avantatges de la Deserialització
- Recuperació de Dades: Recuperar l'estat d'un objecte emmagatzemat.
- Interoperabilitat: Permet que diferents aplicacions comparteixin dades.
Serialització i Deserialització en Objective-C
En Objective-C, la serialització i deserialització es poden realitzar utilitzant diverses tècniques i biblioteques. Una de les més comunes és l'ús de NSCoding
i NSKeyedArchiver
per a objectes personalitzats.
Utilitzant NSCoding
NSCoding
és un protocol que defineix els mètodes que un objecte ha d'implementar per ser serialitzat i deserialitzat.
Exemple de NSCoding
#import <Foundation/Foundation.h> @interface Person : NSObject <NSCoding> @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @end @implementation Person - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.name forKey:@"name"]; [coder encodeInteger:self.age forKey:@"age"]; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _name = [coder decodeObjectForKey:@"name"]; _age = [coder decodeIntegerForKey:@"age"]; } return self; } @end
Utilitzant NSKeyedArchiver i NSKeyedUnarchiver
NSKeyedArchiver
i NSKeyedUnarchiver
són classes que proporcionen funcionalitats per a la serialització i deserialització d'objectes que implementen el protocol NSCoding
.
Exemple de Serialització
Person *person = [[Person alloc] init]; person.name = @"John Doe"; person.age = 30; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:NO error:nil]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"person"];
Exemple de Deserialització
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"person"]; Person *person = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil]; NSLog(@"Name: %@, Age: %ld", person.name, (long)person.age);
Exercicis Pràctics
Exercici 1: Serialitzar i Deserialitzar un Objecte
- Crea una classe
Car
que implementi el protocolNSCoding
. - Afegeix propietats com
make
,model
iyear
. - Implementa els mètodes
encodeWithCoder:
iinitWithCoder:
. - Serialitza una instància de
Car
i emmagatzema-la enNSUserDefaults
. - Deserialitza l'objecte i mostra les seves propietats.
Solució
#import <Foundation/Foundation.h> @interface Car : NSObject <NSCoding> @property (nonatomic, strong) NSString *make; @property (nonatomic, strong) NSString *model; @property (nonatomic, assign) NSInteger year; @end @implementation Car - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.make forKey:@"make"]; [coder encodeObject:self.model forKey:@"model"]; [coder encodeInteger:self.year forKey:@"year"]; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _make = [coder decodeObjectForKey:@"make"]; _model = [coder decodeObjectForKey:@"model"]; _year = [coder decodeIntegerForKey:@"year"]; } return self; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Car *car = [[Car alloc] init]; car.make = @"Toyota"; car.model = @"Corolla"; car.year = 2020; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:car requiringSecureCoding:NO error:nil]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"car"]; NSData *retrievedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"car"]; Car *retrievedCar = [NSKeyedUnarchiver unarchivedObjectOfClass:[Car class] fromData:retrievedData error:nil]; NSLog(@"Make: %@, Model: %@, Year: %ld", retrievedCar.make, retrievedCar.model, (long)retrievedCar.year); } return 0; }
Exercici 2: Serialitzar i Deserialitzar un Array d'Objectes
- Crea una classe
Book
que implementi el protocolNSCoding
. - Afegeix propietats com
title
,author
ipages
. - Implementa els mètodes
encodeWithCoder:
iinitWithCoder:
. - Crea un array de llibres i serialitza'l.
- Deserialitza l'array i mostra les propietats de cada llibre.
Solució
#import <Foundation/Foundation.h> @interface Book : NSObject <NSCoding> @property (nonatomic, strong) NSString *title; @property (nonatomic, strong) NSString *author; @property (nonatomic, assign) NSInteger pages; @end @implementation Book - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.title forKey:@"title"]; [coder encodeObject:self.author forKey:@"author"]; [coder encodeInteger:self.pages forKey:@"pages"]; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _title = [coder decodeObjectForKey:@"title"]; _author = [coder decodeObjectForKey:@"author"]; _pages = [coder decodeIntegerForKey:@"pages"]; } return self; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Book *book1 = [[Book alloc] init]; book1.title = @"1984"; book1.author = @"George Orwell"; book1.pages = 328; Book *book2 = [[Book alloc] init]; book2.title = @"To Kill a Mockingbird"; book2.author = @"Harper Lee"; book2.pages = 281; NSArray *books = @[book1, book2]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:books requiringSecureCoding:NO error:nil]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"books"]; NSData *retrievedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"books"]; NSArray *retrievedBooks = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithObjects:[NSArray class], [Book class], nil] fromData:retrievedData error:nil]; for (Book *book in retrievedBooks) { NSLog(@"Title: %@, Author: %@, Pages: %ld", book.title, book.author, (long)book.pages); } } return 0; }
Conclusió
La serialització i deserialització són processos essencials per a la gestió de dades en Objective-C. Utilitzant NSCoding
, NSKeyedArchiver
i NSKeyedUnarchiver
, podem convertir objectes en una forma que es pot emmagatzemar i transmetre fàcilment, i després reconstruir-los quan sigui necessari. Aquests conceptes són fonamentals per a la persistència de dades, la comunicació entre aplicacions i la interoperabilitat.
Curs de Programació en Objective-C
Mòdul 1: Introducció a Objective-C
- Introducció a Objective-C
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Tipus de Dades i Variables
- Operadors i Expressions
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Mètodes
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Sintaxi de Mètodes en Objective-C
- Mètodes de Classe i d'Instància
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Gestió de Memòria
- Introducció a la Gestió de Memòria
- Comptatge Automàtic de Referències (ARC)
- Retenció i Alliberament Manual
- Millors Pràctiques de Gestió de Memòria
Mòdul 6: Temes Avançats
Mòdul 7: Treballant amb Dades
- Gestió d'Arxius
- Serialització i Deserialització
- Conceptes Bàsics de Xarxes
- Treballant amb JSON i XML
Mòdul 8: Desenvolupament d'Interfícies d'Usuari
- Introducció a UIKit
- Vistes i Controladors de Vista
- Disseny Automàtic
- Gestió de l'Entrada de l'Usuari