Question

J'ai un dictionnaire d'objets; ils sont tous les objets POCO qui devraient être sérialisable. Quelle technique devrais-je regarder pour écrire ces sur le disque. Je cherche l'option la plus simple d'écrire quelques listes pour enregistrer l'état.

Je crois avoir 3 options.

  1. fichiers plist. Cependant, cela semble se limiter à stocker des objets prédéfinis (chaînes, des nombres, etc.) ne sont pas des objets (comme une personne avec un nom et âge).

  2. CoreData. (Nouveau dans la version 3.0) Ce serait bien travailler; mais mon modèle de données aurait besoin de changer pour faire ce travail. Ce serait une reprise massive et je ne sais pas si cela vaut la peine.

  3. SqlLite. Mettre en œuvre d'une simple base de données SQL pour lire et à partir. Je l'ai fait le moins de reserch dans celui-ci, mais je ne veux pas avoir à « réécrire » certaines des fonctions ORM de données de base.

Était-ce utile?

La solution

Vous faites cela de la même manière que vous le feriez sur Mac OS X: vos Poços doivent être conformes au protocole NSCoding. Voir pour une référence conceptuelle et ici pour la référence NSCoding.

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

Autres conseils

Pour sérialisation objet personnalisé que vous avez juste besoin de se conformer au protocole NSCoding. Si votre objet étend NSObject tout ce que vous devez faire (je crois) est de mettre en œuvre ces (par exemple pour objet 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 de sérialisation. Ils sérialiser tous les objets qu'ils détiennent (si des objets à mettre en œuvre l'interface NSCoder - ils le font si elles étendent NSObject). Le encodeWithCoder de NSObject et initWithCoder ne font rien par défaut de sorte que si vous implémentez votre propre code dans vos classes ne se sérialisé.

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

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

NSCoder est l'idiome de Cocoa pour la sérialisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top