Domanda

Per semplicità, supponiamo che abbiamo la seguente interfaccia semplice classe:

@interface Person : NSObject <NSCoding> {
  NSString *firstname;
  NSString *lastname;
}

@property (copy) NSString *firstname;
@property (copy) NSString *lastname;

@end

E 'possibile serializzare l'oggetto in un plist (supponendo che il protocollo NSCoding è implementato correttamente)? ??

Aggiornamento 31 Dicembre 2010 14:40

Ho un po 'di follow-up domande su questo. E 'possibile avere NSKeyedArchiver esportazione plist in formato XML? Inoltre, è possibile scaricare il codice XML in variabile anziché un file?

È stato utile?

Soluzione

Per quanto riguarda l'impostazione del formato di output in formato XML, suggerisco:

[myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];

Per quanto riguarda ottenerlo in una variabile e non un file, vorrei suggerire la creazione del NSKeyedArchiver con l'initForWritingWithMutableData: inizializzatore. Una volta terminato codifica, assicuratevi di chiamare finishEncoding su di esso, e quindi l'XML sarà nel NSMutableData che avete passato in in fase di init.

Se è quindi necessario ottenere un NSString a questo, si può ottenere che dal vostro NSMutableData in questo modo:

NSString* xmlString = [[NSString alloc] initWithData: myMutableData  encoding: NSUTF8StringEncoding];

Questo dovrebbe fare il trucco. Buona fortuna!

Altri suggerimenti

Sì, lo è. Tuttavia, non è davvero conveniente come si deve codificare l'oggetto e poi salvare l'oggetto NSData nella matrice / dizionario che si desidera salvare nel plist.

NSKeyedArchiver salverà automaticamente l'oggetto in un plist quando si dà un percorso di file filename.plist.

Questo sembra essere un difetto in iOS. Mi chiedo se è specifico per la gestione degli utenti default plist però.

Come possibile soluzione, forse si potrebbe provare a gestire un NSMutableDictionary per le impostazioni e leggere / scrivere la dizionario come file plist direttamente.

Per scrivere i dati:

NSString* error;
NSData* pListData = [NSPropertyListSerialization dataFromPropertyList:settingsDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
[data writeToFile:settingsFilePath atomically:YES];

Quindi per leggere la parte posteriore dei dati:

NSString* error;
NSData* pListData = [NSData dataWithContentsOfFile:settingsFilePath];
settingsDictionary = [NSPropertyListSerialization propertyListFromData:pListData mutabilityOption:NSPropertyListImmutable format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

Prova questa magia:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];

plist[@"personData"] = data;

Per ottenere di nuovo fuori basta usare:

Person* p = [NSKeyedUnarchiver unarchiveObjectWithData:plist[@"personData"]];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top