Подтвердить что ты не робот

Как сериализовать простой объект в iPhone sdk?

У меня есть словарь объектов; все они являются объектами POCO, которые должны быть сериализуемыми. Какую технику я должен искать для записи на диск. Я ищу простейший вариант для написания нескольких списков для сохранения состояния.

Я думаю, у меня есть 3 варианта.

  • файлы plist. Однако это ограничивается только хранением предопределенных объектов (строк, чисел и т.д.), А не объектов (например, человека с именем и возрастом).

  • CoreData. (Новое в версии 3.0) Это будет хорошо работать; однако моя модель данных должна измениться, чтобы сделать эту работу. Это будет серьезная переделка, и я не уверен, стоит ли этого делать.

  • SQLLite. Внедрение простой базы данных SQL для чтения и из. Я сделал наименьшее количество reserch в этот, но я не хочу, чтобы "переписать" некоторые из основных функций ORM данных.

4b9b3361

Ответ 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 для сериализации.