web-dev-qa-db-ja.com

iPhone SDKで単純なオブジェクトをシリアル化するにはどうすればよいですか?

オブジェクトの辞書があります。これらはすべて、シリアル化可能である必要があるPOCOオブジェクトです。これらをディスクに書き込むには、どのような手法を検討する必要がありますか。状態を保存するためにいくつかのリストを作成するための最も簡単なオプションを探しています。

私には3つの選択肢があると思います。

  1. plistファイル。ただし、これは、オブジェクト(名前と年齢の人など)ではなく、事前定義されたオブジェクト(文字列、数字など)のみを格納することに限定されているようです。

  2. CoreData。 (3.0の新機能)これはうまく機能します。ただし、これを機能させるには、データモデルを変更する必要があります。これは大規模な手直しであり、努力する価値があるかどうかはわかりません。

  3. SQLLite。読み取りと読み取りを行う単純なSQLデータベースを実装します。私はこれに対して最小限の調査を行いましたが、コアデータORM関数の一部を「書き換える」必要はありません。

28
Bluephlame

これは、Mac OS Xで行うのと同じ方法で行います。つまり、POCOはNSCodingプロトコルに準拠している必要があります。概念的なリファレンスについては here を、NSCodingリファレンスについては here を参照してください。

データがそれほど広範ではなく、オブジェクト間に途方もなく複雑な関係がない場合は、すべてをplistとして書き出すのがおそらく最善の選択肢です。実行は非常に高速で、コードへの実装は簡単です。あなたが言ったように、CoreDataはおそらくあなたのコードを適応させるための余分な作業のlotになるでしょう、そしてsqliteは本当に完璧なデータを保存するのにのみ適していますリレーショナルデータベースに保存されます。 sqliteもバイナリplistを使用するよりも遅く、より多くのリソースを使用することに注意してください。

14
Marc W

カスタムオブジェクトをシリアル化するには、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”];
}

NSArrayNSDictionaryは、すでにシリアル化のメソッドを実装しています。保持しているすべてのオブジェクトをシリアル化します(オブジェクトがNSCoderインターフェイスを実装している場合-NSObjectを拡張している場合はシリアル化します)。 NSObjectのencodeWithCoderinitWithCoderはデフォルトでは何もしないため、クラスに独自のコードを実装しない限り、何もシリアル化されません。

オブジェクトの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;
33
stefanB

NSCoder は、シリアル化の標準的なCocoaイディオムです。

0
rpetrich