27 votes

Comment sérialiser un objet simple dans le sdk de l'iPhone?

J'ai un dictionnaire d'objets; ils sont tous des objets POCO qui doit être sérialisable. Quelle technique dois-je regarder pour écrire ces vers le disque. Je suis à la recherche de la solution la plus simple à écrire quelques listes d'enregistrer l'état.

Je pense que j'ai 3 options.

  1. des fichiers plist. Toutefois, cela semble être limitée uniquement à stocker des objets prédéfinis (chaînes de caractères, nombres, etc) pas des objets (comme une personne avec un nom et âge).

  2. CoreData. (Nouveau dans la version 3.0) Ce serait bien travailler; cependant mon modèle de données faudrait changer pour faire ce travail. Ce serait un énorme retravailler et je ne sais pas si cela en vaut la peine.

  3. SQLLite. Mettre en œuvre une simple base de données SQL lire et de. J'ai fait le moins de recherche dans celui-ci, mais je ne veux pas avoir à "réécrire" quelques-uns de la base de données ORM fonctions.

32voto

stefanB Points 27796

Pour sérialiser l'objet personnalisé vous avez juste besoin de se conformer à l' NSCoding protocole. Si votre objet s'étend au-NSObject tout ce que vous devez faire (je crois) est de mettre en œuvre ces (exemple pour objet de personne):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@"Name"];
    [coder encodeInteger:age forKey:@"Age"];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@"Name"] retain];
    age  = [coder decodeIntegerForKey:@"Age"];
}

NSArray et NSDictionary mettent déjà en œuvre des méthodes pour la sérialisation. Ils sérialiser tous les objets qu'ils détiennent (si les objets de mettre en œuvre NSCoder interface - ils faire si elles s'étendent NSObject). NSObject de l' encodeWithCoder et initWithCoder ne font rien par défaut de sorte que si vous implémentez votre propre code dans vos classes, rien ne se sérialisé.

Si vous avez NSArray ou NSDictionary d'objets, vous pouvez les synchroniser à l'aide de:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;

14voto

Marc W Points 13166

Vous procédez de la même manière que vous le feriez sur un Mac OS X: vos POCOs doit être conforme à l' NSCoding protocole. Voir ici pour une référence conceptuelle, et ici pour la NSCoding de référence.

Si les données n'est pas fou vaste et vous n'avez pas ridiculement compliqué les relations entre les objets, l'écriture, tout comme un plist est probablement votre meilleure option, c'est très rapide à exécuter et simple à mettre en œuvre dans votre code. Comme vous l'avez dit, CoreData sera probablement un beaucoup de travail supplémentaire pour s'adapter à votre code, et sqlite est vraiment seulement bon pour le stockage des données, qui est parfaite pour être stockées dans une base de données relationnelle. Gardez à l'esprit que sqlite est également plus lent et utilise plus de ressources que de travailler avec des binaires plists.

0voto

rpetrich Points 25769

NSCoder est la norme de Cacao idiome pour la sérialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X