#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:
- Создайте свой собственный экземпляр
NSKeyedArchiver
withinitForWritingWithMutableData:
. - Установите формат с
setOutputFormat:NSPropertyListXMLFormat_v1_0
помощью . - Закодируйте свой корневой объект с
encodeObject:forKey:
помощью . - Вызов
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];