Использование NSKeyedArchiver для генерации XML из NSManagedObjects, хранящихся в NSDictionary

#ios #cocoa #core-data #nskeyedarchiver

#iOS #cocoa #core-данные #nskeyedarchiver

Вопрос:

У меня есть NSDictionary, который содержит кучу NSManagedObjects. Затем я могу использовать NSKeyedArchiver для записи этого в объект NSData. Они генерируются с использованием этого метода.Который отлично работает и позволяет мне сохранить раздел схемы на диск, а затем прочитать его обратно как новый набор объектов в базовой модели данных. Если я использую либо archivedDataWithRootObject:, либо archiveRootObject:toFile:, согласно документации, я вижу, что формат архива — NSPropertyListBinaryFormat_v1_0, тогда как я хочу сериализовать в NSPropertyListXMLFormat_v1_0, чтобы я мог записывать свои объекты в файл, а затем обрабатывать их в другом месте как обычный старый XML. (На самом деле я хочу создавать документы из них в системе на базе Windows.)

1) Есть ли способ, которым я могу это сделать? Если да, то как? 2) Есть ли лучший подход.

Я хочу сохранить сериализованный характер, поскольку я также хочу позже отправить файл обратно на устройство iOS и воссоздать объектную модель.

Ответ №1:

  1. Создайте свой собственный экземпляр NSKeyedArchiver with initForWritingWithMutableData: .
  2. Установите формат с setOutputFormat:NSPropertyListXMLFormat_v1_0 помощью .
  3. Закодируйте свой корневой объект с encodeObject:forKey: помощью .
  4. Вызов finishEncoding .

Чтобы разархивировать данные, которые вы закодировали таким образом, вам необходимо аналогичным образом создать экземпляр an NSKeyedUnarchiver .

Ответ №2:

Спасибо, Оле! Я двигался в этом направлении, но не был уверен, что это правильный путь. Вот что я сделал в коде на случай, если это кому-то поможет.

 NSDictionary *dataAsDictionary=[self toDictionaryBlockingRelationships:blockRelationship];
NSString   *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath];
NSMutableData *xmlData=[NSMutableData data];

NSKeyedArchiver *archive=[[NSKeyedArchiver alloc ]initForWritingWithMutableData:xmlData];

[archive setOutputFormat:NSPropertyListXMLFormat_v1_0];
[archive encodeRootObject:dataAsDictionary];
[archive finishEncoding];

if(![xmlData writeToFile:savePath atomically:NO]){
    NSLog(@"Failed to write to file to filePath=%@", savePath);
}
[archive release];