この問題を解決する方法についてのアイデアはありますが、私の問題にもっと簡単で拡張可能なものがあるかどうか知りたいと思っていました.
私が取り組んでいるプログラムには、2 つの基本的な形式のデータがあります。画像と、それらの画像に関連付けられた情報です。画像に関連付けられた情報は、非常に単純な JET データベース (4 つのテーブル) に以前に格納されていましたが、格納されたフィールドが遅く、不完全であることが判明しました。データ ストレージの新しい実装に移行しています。関連するデータ構造の単純さを考えると、データベースはやり過ぎだと思っていました。
各画像には独自の情報 (キャプチャ パラメータ) があり、相互に関連する画像のグループの一部 (たとえば、同じ 30 分間に撮影されたもの) になり、全体としてより大きなグループの一部 (同じ人物が撮影されたもの) になります。 )。現在、一意の識別子を持つ辞書に人を保存しています。次に、各人物にはさまざまな写真グループのリストがあり、各写真グループには写真のリストがあります。これらのクラスはすべてシリアライズ可能で、辞書をシリアライズおよびデシリアライズしているだけです。かなり簡単なもの。辞書が天文学的なサイズにならないように、画像は個別に保存されます。
問題は、新しい情報フィールドを追加する必要がある場合、どうすればよいかということです。潜在的な将来のリビジョンを考慮して、これらのデータ構造をセットアップする簡単な方法はありますか? 以前は、C でこれを処理する方法は、将来の拡張性のために多数の空のバイト (少なくとも ak) を持つシリアル化可能な構造体を作成し、構造体のバイトの 1 つでバージョンを示すことでした。次に、プログラムが構造体を読み取ると、大規模な switch ステートメントに基づいて、どの逆シリアル化を使用するかがわかります (無関係なデータは無視されるフィールドに入るだけなので、古いバージョンでは新しいデータを読み取ることができます)。
そのようなスキームはC#に存在しますか? 同様に、String オブジェクトと Int オブジェクトのグループであるクラスがあり、その構造体に別の String オブジェクトを追加した場合、ディスクからオブジェクトを逆シリアル化し、それに文字列を追加するにはどうすればよいでしょうか? 複数のバージョンのデータ クラスと、逆シリアル化ストリームを受け取り、基本クラスに格納されているバージョン情報に基づいて逆シリアル化を処理するファクトリを保持する必要がありますか? または、ディスク上のすべてのフィールドを自動的に逆シリアル化する Dictionary のようなクラスは、この種の情報を格納するのに理想的ですか?新しいフィールドが追加された場合は、例外をキャッチして、それらの値を空の文字列と Int に置き換えることができますか?
辞書のアプローチを採用した場合、ファイルの読み取り/書き込みやパラメーターの取得時間に関連する速度低下はありますか? クラスにフィールドしかない場合、フィールドの取得は瞬時に行われますが、ディクショナリでは、そのクラスに関連する小さなオーバーヘッドが発生します。
ありがとう!