Можно ли сериализовать пользовательские объекты в файл plist в Objective-C? - PullRequest
4 голосов
/ 31 декабря 2010

Для простоты предположим, что у нас есть следующий простой интерфейс класса:

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

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

@end

Можно ли сериализовать этот объект в список (при условии, что протокол NSCoding реализован правильно)?

Обновление 31 декабря 2010 г. 14: 40

У меня есть несколько дополнительных вопросов по этому вопросу. Можно ли NSKeyedArchiver экспортировать plist как XML? Кроме того, возможно ли вывести XML в переменную вместо файла?

Ответы [ 5 ]

2 голосов
/ 31 декабря 2010

Что касается настройки формата вывода на XML, я предлагаю:

[myKeyedArchiver setOutputFormat: NSPropertyListXMLFormat_v1_0];

Что касается получения его в переменную, а не в файл, я бы предложил создать ваш NSKeyedArchiver с initForWritingWithMutableData: initializer. Когда кодирование закончено, Обязательно вызовите на нем FinEncoding, и тогда XML будет в NSMutableData, который вы передали во время инициализации.

Если вам необходимо получить строку NSString, вы можете получить ее из NSMutableData следующим образом:

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

Это должно сработать. Удачи!

0 голосов
/ 25 января 2016

Попробуйте эту магию:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:person];

plist[@"personData"] = data;

Чтобы вернуть его, просто используйте:

Person* p = [NSKeyedUnarchiver unarchiveObjectWithData:plist[@"personData"]];
0 голосов
/ 27 мая 2011

Это похоже на дефект в iOS.Мне интересно, специфично ли это для обработки plist по умолчанию пользователя.

В качестве возможного обходного пути, возможно, вы могли бы попробовать управлять NSMutableDictionary для ваших настроек и читать / записывать словарь как файл plist напрямую.

Для записи данных:

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

Затем для чтения данных обратно:

NSString* error;
NSData* pListData = [NSData dataWithContentsOfFile:settingsFilePath];
settingsDictionary = [NSPropertyListSerialization propertyListFromData:pListData mutabilityOption:NSPropertyListImmutable format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
0 голосов
/ 31 декабря 2010

NSKeyedArchiver автоматически сохраняет объект в plist, когда вы указываете ему путь к файлу filename.plist.

0 голосов
/ 31 декабря 2010

Да, это так. Однако это не очень удобно, поскольку сначала нужно кодировать объект, а затем сохранить объект NSData в массив / словарь, который вы хотите сохранить в списке.

...