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;
}
@endUtilitzant 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
Carque implementi el protocolNSCoding. - Afegeix propietats com
make,modeliyear. - Implementa els mètodes
encodeWithCoder:iinitWithCoder:. - Serialitza una instància de
Cari 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
Bookque implementi el protocolNSCoding. - Afegeix propietats com
title,authoripages. - 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
