0

アプリケーションのバージョン 1.0 にはデータ モデルがあり、すべてのモデル クラスが NSCoding プロトコルに準拠しているため、NSKeyed(Un)Archiver クラスを使用して保存/ロードされます。次の階層が存在するとします。

-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)

このような方法で保存されたレガシー ファイルがあるとしますが、下位互換性のために、次の新しいデータ モデルを使用してアプリケーションのバージョン 2.0 にロードする必要があります。

-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)

明らかに、一部のデータが欠落しており、入力する必要があります。以前に存在した「居住者の数」ごとに、基本的な「占有者」オブジェクトを作成する必要があります。私が探しているのは、特に .m/.h ファイル自体ではなく、クラス/階層のリストしかない場合に、以前のデータ モデルをプログラムで読み込む方法です。

したがって、私がやりたいことは次のとおりです (Houses 配列を使用してシリアル化されたファイル Houses.data があると仮定します):

NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];

何か案は?

4

1 に答える 1

1

ここでのコツは、NSKeyedUnarchiver が提供する setClass:forClassName: 関数を使用することだと思います。「TownHouse クラスを使用して、House クラスのすべてのインスタンスを逆シリアル化します」と言うことができます。

次に、TownHouse の initWithCoder: 関数を変更して、いずれかの階層をデコードする必要があります。これを行うには、decodeObject または decodeObjectForKey: を呼び出してから、isKindOfClass: を使用して、処理しているオブジェクトのタイプを確認します。また、 containsValueForKey: を使用して、特定のキーを読み取ろうとする前に確認することもできます。

それが役立つことを願っています!

于 2009-06-23T03:26:02.250 に答える