2011-10-16 18 views
3

アプリケーションの開始時にデータベースからオブジェクトを逆シリアル化してから、アプリケーションのライフタイム中にユーザーがオブジェクトを更新し、最後のオブジェクトがXML文字列としてdbにシリアル化されます。最初と最後の文字列を比較する以外にオブジェクトが更新されているかどうかを調べる方法はありますか?そのオブジェクトを見つけるための素早い方法

私はそれを使用することが可能である知っている:

  1. String.GetHashCode方法、しかしとして「異なる文字列が同じハッシュコードを返すことができる」と指摘しました。

  2. MD5ハッシュとして行われたHow to compute and compare hash values by using Visual C#。私は別の文字列が同じMD5ハッシュを返すことができるかどうかはわかりませんが。

私のXMLは常に100KB未満です。

+5

すべての入力文字列より長い場合を除き、ハッシュコードは一意になることはありません。 – SLaks

+0

ハッシュコードのルートに行くならば、.Netフレームワークが等価比較を高速化するのと同様のことをすることができます:オブジェクトの 'GetHashCode'結果をチェックしてください。それらが等しい場合は、「等しい」をチェックします。それらがまだ等しい場合は、それらを変更しないでください。可能な限り速くはありませんが、実装は簡単です。この作業を終えたら、実際により速い方法が必要かどうかを確認してください。シリアライゼーションとワイヤ転送は、等価比較よりもはるかに遅い可能性があるため、ボトルネックではないものを最適化しようとしている可能性があります。 –

+0

もっと速い方法が必要な場合は、サムが示唆している回答(マニュアルチェンジトラッキング)を調べることができます。また、.Net Entity Frameworkには、この種の変更トラッキングが組み込まれています。カスタムデータアクセスコードではなく、この変更トラッキングを使用することができます。 –

答えて

2

IPropertyChangedを実装し、オブジェクトが汚れているかどうかを追跡します。

+1

少なくとも、オブジェクトが更新されたときに他のプロパティ設定ツールが微調整できるプライベートプロパティ。これにより、プロパティの値を変更しない更新がアプリケーションで重要かどうかを柔軟に判断できます。 – HABO

+0

他の回答はありません – walter