Как сериализовать простой объект в iPhone sdk?
У меня есть словарь объектов; все они являются объектами POCO, которые должны быть сериализуемыми. Какую технику я должен искать для записи на диск. Я ищу простейший вариант для написания нескольких списков для сохранения состояния.
Я думаю, у меня есть 3 варианта.
-
файлы plist. Однако это ограничивается только хранением предопределенных объектов (строк, чисел и т.д.), А не объектов (например, человека с именем и возрастом).
-
CoreData. (Новое в версии 3.0) Это будет хорошо работать; однако моя модель данных должна измениться, чтобы сделать эту работу. Это будет серьезная переделка, и я не уверен, стоит ли этого делать.
-
SQLLite. Внедрение простой базы данных SQL для чтения и из. Я сделал наименьшее количество reserch в этот, но я не хочу, чтобы "переписать" некоторые из основных функций ORM данных.
Ответы
Ответ 1
Вы делаете это так же, как и в Mac OS X: ваши POCOs должны соответствовать протоколу NSCoding
. См. здесь для концептуальной ссылки и здесь для NSCoding ссылка.
Если данные не настолько сумасшедшие, и у вас нет смехотворно сложных отношений между вашими объектами, выписывать все как plist, вероятно, ваш лучший вариант; он очень быстро выполняется и прост в реализации в вашем коде. Как вы сказали, CoreData, вероятно, будет много дополнительной работы по адаптации вашего кода, и sqlite действительно хорош только для хранения данных, которые идеально подходят для хранения в реляционной базе данных. Имейте в виду, что sqlite также медленнее и использует больше ресурсов, чем работу с бинарными пластинами.
Ответ 2
Для сериализации настраиваемого объекта вам просто нужно соответствовать протоколу NSCoding
. Если ваш объект расширяет NSObject, все, что вам нужно сделать (я считаю), это реализовать их (пример для объекта person):
// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
[super encodeWithCoder:coder];
[coder encodeObject:name forKey:@"Name"];
[coder encodeInteger:age forKey:@"Age"];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
name = [[coder decodeObjectForKey:@"Name"] retain];
age = [coder decodeIntegerForKey:@"Age"];
}
NSArray
и NSDictionary
уже реализуют методы для сериализации. Они будут сериализовать все объекты, которые они хранят (если объекты реализуют интерфейс NSCoder - они делают, если они расширяют NSObject). NSObject encodeWithCoder
и initWithCoder
ничего не делают по умолчанию, поэтому, если вы не реализуете свой собственный код в своих классах, ничего не сериализуется.
Если у вас есть NSArray или NSDictionary объектов, вы можете синхронизировать их, используя:
// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;
Ответ 3
NSCoder
- стандартная идиома Cocoa для сериализации.