Как мне сериализовать простой объект в iPhone SDK? - PullRequest
28 голосов
/ 18 мая 2009

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

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

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

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

  3. SQLLite. Реализуйте простую базу данных SQL для чтения в и из. Я сделал наименьшее количество повторений в этом, но я не хочу «переписывать» некоторые функции ORM для основных данных.

Ответы [ 3 ]

33 голосов
/ 18 мая 2009

Для сериализации пользовательского объекта вам просто необходимо соответствовать протоколу 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). encodeWithCoder и initWithCoder NSObject по умолчанию ничего не делают, поэтому, если вы не реализуете собственный код в своих классах, ничего не сериализуется.

Если у вас есть 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;
14 голосов
/ 18 мая 2009

Вы делаете это так же, как в Mac OS X: ваши POCO должны соответствовать протоколу NSCoding. См. здесь для концептуальной ссылки и здесь для ссылки NSCoding.

Если данные не настолько безумно обширные, и у вас нет смехотворно сложных отношений между вашими объектами, то выписывание всего в виде списка может быть вашим лучшим вариантом; это очень быстро выполнить и просто реализовать в вашем коде. Как вы сказали, CoreData, вероятно, потребует много дополнительной работы по адаптации вашего кода, а sqlite действительно хорош только для хранения данных, которые идеально подходят для хранения в реляционной базе данных. Имейте в виду, что sqlite также работает медленнее и использует больше ресурсов, чем работа с двоичными списками.

0 голосов
/ 18 мая 2009

NSCoder - стандартная идиома Какао для сериализации.

...