1

オブジェクトのプロパティがアーカイブとアーカイブ解除プロセスの間で変化するとき、私は NSKeyedArchiver と NSKeyedUnarchiver に少し苦労しています。具体的な例を次に示します。

私はクラスを持っているTaskとしましょう. 今、使用してアーカイブし、ファイルに書き込みます。後でファイルから読み込んで、目的の場所に戻ることができます。問題は、新しいプロパティを取得し、物事を面白くするために 1 つを失うときに発生します。namedescNSStringNSKeyedArchiver archivedDataWithRootObjectNSKeyedUnarchiver unarchiveObjectWithData(data)Task

これはですTaskname、欠落しています。さらに、 typeのプロパティを追加します。そして、シミュレーターを起動します。問題は、アーカイブされていないのは古いプロパティを持つ古いものであり、新しいものではないことです。NSStringdescdateDueNSDateTaskdescdateDue

実際には、プロパティが現在のinitFromCoderクラスに存在しない場合を考慮し、それをデコードしようとしません。

オブジェクトをシリアル化したときと同じようにオブジェクトの正確なレプリカを作成しないように NSCoder メソッドに説明する方法はありますか (これはシリアル化/逆シリアル化の定義の一部であることに気付きました)、むしろバージョンを柔軟に変更できるようにする方法はありますか?それ?

ありがとう

4

1 に答える 1

1

簡単な方法が 1 つあります。バージョンをデータに書き込み、それを の先頭として読み取りますinitFromCoder。バージョン比較が失敗した場合はnil、イニシャライザから戻るだけです。

プロパティを追加すると、データをデコードしようとしても、nil値を取得するだけです。いつでもnil値を確認できます。

プロパティを削除しても問題はありません。

エンコードとデコードの両方を実装するのはあなたなので、好きなように実装できることに注意してください。

于 2012-11-14T00:07:56.093 に答える