Come faccio a serializzare un oggetto in un file utilizzando NSKeyedArchiver in formato NSPropertyListXMLFormat_v1_0?
-
05-09-2019 - |
Domanda
Si spera che il titolo è abbastanza chiaro. In ogni modo, a quanto pare:
[NSKeyedArchiver archiveRootObject:rootObject toFile:path];
è limitato a NSPropertyListBinaryFormat_v1_0
.
Ho bisogno il formato di essere leggibile [così xml]. Se siete interessati, questo fa parte del progetto sarò finalmente messo su github con un post su "Come GPS Unit Test delle applicazioni"
: -)
Soluzione
Devi usare NSPropertyListSerialization
per convertirlo. In sostanza, assumendo l'oggetto che si sta serializzazione si chiama myObject
e il file finale è memorizzato in myPath
, si serializzare in XML usando qualcosa come il seguente frammento di codice:
NSString *error = nil;
NSData *mySerializedObject = [NSKeyedArchiver archivedDataWithRootObject:myObject];
NSData *xmlData = [NSPropertyListSerialization dataFromPropertyList:mySerializedObject
format:NSPropertyListXMLFormat_v1_0
errorDescription:&error]:
if( xmlData ) {
[xmlData writeToFile:myPath atomically:YES];
} else {
NSLog(error);
[error release];
}
Altri suggerimenti
Invece di utilizzare il metodo di classe, provare a creare un'istanza di NSKeyedArchiver e l'utilizzo di setOutputFormat:NSPropertyListXMLFormat_v1_0
per specificare formato XML. L'unico inconveniente è che ci vorrà un paio di righe di codice in più dal momento che per gestire effettivamente la serializzazione, non sarà solo restituire un oggetto NSData in un solo passaggio.
Si dovrà codificare la classe di oggetti utilizzando il metodo - (void) encodeWithCoder (NSCoder *) encoder {
[coder encodeObject:name forKey:@"name"];
[coder encodeObject:address forKey:@"address"];
[coder encodeObject:position forKey:@"position"];
}