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

  1. Crea una classe Car que implementi el protocol NSCoding.
  2. Afegeix propietats com make, model i year.
  3. Implementa els mètodes encodeWithCoder: i initWithCoder:.
  4. Serialitza una instància de Car i emmagatzema-la en NSUserDefaults.
  5. 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

  1. Crea una classe Book que implementi el protocol NSCoding.
  2. Afegeix propietats com title, author i pages.
  3. Implementa els mètodes encodeWithCoder: i initWithCoder:.
  4. Crea un array de llibres i serialitza'l.
  5. 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.

© Copyright 2024. Tots els drets reservats