2010-07-20 3 views
1

J'ai une application pour iPhone qui utilise une quantité relativement faible de données. Je voudrais enregistrer les données au format XML et pouvoir les charger en mémoire dans des objets Objective-C. Je voudrais utiliser les installations du SDK iPhone comme NSPropertyListSerialization ou writeToFile: atomically: classes et méthodes.Sérialisation d'objet au format XML avec Obj-C/iPhone SDK

Le NSPropertyListSerialization documentation dit que

La classe NSPropertyListSerialization fournit des méthodes qui convertissent la propriété liste des objets vers et depuis plusieurs formats sérialisés. La liste de propriétés comprend NSData, NSString, NSArray, NSDictionary, NSDate et objets NSNumber.

Supposons que je voudrais sauver quelques personne objets (une famille) dont les attributs sont tous les types -liste des biens. La seule façon dont je-réussi à enregistrer ce au format XML est en faisant:

// container for person objects 
NSMutableArray *family = [[NSMutableArray alloc] init]; 

for (int i = 0; i < numberOfPeople; i++) {  
// simulate person's attributes 
NSArray *keys = [[NSArray alloc] initWithObjects: 
     @"id", 
     @"name", 
     @"age", 
     Nil]; 

NSArray *values = [[NSArray alloc] initWithObjects: 
     [NSNumber numberWithInt:i], 
     @"Edward", 
     [NSNumber numberWithInt:10], 
     Nil]; 

// create a Person (a dictionary) 
NSDictionary *person = [[NSDictionary alloc] initWithObjects:values forKeys:keys]; 
[family addObject:person]; 
[person release]; 
} 

// save the "person" object to the property list 
[family writeToFile:@"<path>/family.plist" atomically:YES]; 
[family release]; 

qui générerait le fichier family.plist.

Notez, cependant, que mon objet Personne est en fait un objet NSDictionary (que je ne pense pas que le sous-classement serait une bonne idée) avec des attributs en tant que clés. Est-il possible de créer une classe Objective-C comme ceci:

@interface Person : NSObject { 
NSString *_id; 
NSString *_name; 
NSNumber *_age; 
} 
@end 

et sérialisation dans un fichier plist/XML? (J'ai besoin de sauvegarder l'objet au format texte (pas binaire) afin que je puisse éditer ces données dans un éditeur de texte et permettre à mon application de charger ceci à l'exécution, en convertissant normalement en objets Objective-C).

Merci à l'avance, Eduardo

Répondre

4

Si vous avez pas déjà lu, je recommande vivement le Archives and Serializations Programming Guide, en particulier les parties sur les objets de codage et de décodage en utilisant le protocole NSCoding.

Si vous utilisez ce protocole, vos objets seront stockés sous NSData. Mais vous pouvez l'imiter (c'est-à-dire créer votre propre protocole) pour que vos classes retournent des représentations de dictionnaire d'elles-mêmes et puissent s'initialiser à partir d'une représentation de dictionnaire (je ne pense pas qu'il existe un moyen de le faire automatiquement). Cependant, le résultat sera essentiellement le même que le fichier family.plist que vous avez posté.

Si vous êtes à la recherche d'un moyen d'obtenir un fichier XML comme ceci:

<person> 
    <id>0</id> 
    <name>Edward</name> 
    <age>10</age> 
</person> 

alors plist est pas ce que vous voulez.

+0

Brian. J'ai lu des articles sur les archives et les sérialisations. Le point principal est que, comme vous l'avez dit, l'objet sera enregistré dans le fichier .plist sous la forme (NSData).Je pourrais faire des méthodes utilitaires pour représenter/initialiser la classe de personne avec un dictionnaire, mais ce n'est pas si différent de "sous-classer" ou en utilisant l'approche que j'ai mentionnée dans le post. J'espérais «encoder»/«décoder» des objets Objective-C au format XML à l'aide de l'API (soit en utilisant des sous-classes NSCoder, soit en utilisant PListSerialization). Peut-être que je devrais utiliser un analyseur XML et gérer tout seul sans la syntaxe plist, ce qui est mieux). –

+0

J'ai décidé de ne plus utiliser .plist et d'utiliser à la place des fichiers XML + du DOM Parser. Il y a un joli tutoriel sur http://www.raywenderlich.com/725/how-to-read-and-write-xml-documents-with-gdataxml. J'ai réalisé que la syntaxe plist n'est pas la plus appropriée à mes besoins, mais je m'attendais à ce que le SDK iPhone m'aide à réaliser la sérialisation de mes objets Objective-C (en mode XML) de manière directe, ce qui n'est pas le cas. –

0

J'ai honte de dire que j'utilise [NSString stringWithformat:] pour créer des documents XML. C'est le moyen le plus simple que j'ai trouvé jusqu'ici.

+0

Alors, vous faites le travail vous-même. Représentation de l'objet en tant qu'entité XML et après décodage (éventuellement en utilisant un analyseur XML/DOM). Je m'attendais à sérialiser mes objets Objective-C en .plist en utilisant NSCoders ou PropertyListSerialization. Je ne comprends pas pourquoi l'API n'est pas assez flexible pour permettre à mes objets personnalisés d'être sérialisés au format XML s'ils n'ont que des attributs similaires à ceux de la liste de propriétés. –

Questions connexes