2011-01-25 6 views
0

強力なDataContractSerializerを使用して、XMLファイルにデータを書き込みまたは読み取る必要があります。このユースケースでDataContractSerializerを効率的に使用するにはどうすればよいですか?

私の考え方では、DataContractSerializerは、構造体全体または構造体のリストでしかデータを読み書きできません。

私の使用例は以下のとおりです。このAPIを使用してパフォーマンスを最適化する方法を理解できません。

"Information"という名前の構造を持ち、List<Information>があり、このリストには予想外の数の要素があります。

ユーザーはこのリストに新しい要素を頻繁に更新または追加することができます。

操作(追加または更新)ごとに、リスト内のすべての要素を同じXM​​Lファイルにシリアル化する必要があります。

したがって、XMLに変更されていなくても、同じデータを書きます。それは理にかなっていませんが、私はこれが起きたのを避けるためのアプローチを見つけることができません。

トゥームストーンの仕組みのせいで、私はすべての情報を10秒で保存する必要があります。

私は、パフォーマンスの怖い、多分UIラグを作る...

は私が部分的にDataContractSerializerによってXMLファイルにデータ情報を更新または追加するには、いずれかの回避策を使用してもらえますか?

答えて

0

DataContractSerializerを使用すると、選択したアイテムをシリアル化することができます。変更したデータを識別するスキームと効率的にシリアル化する方法を考え出す必要があります。たとえば、いずれかの方法があります

  1. 構造のリスト全体をファイルにシリアライズすることから始めます。
  2. リストからオブジェクトを追加/更新/削除するたびに、変更の種類と変更されたオブジェクトを識別するdiffオブジェクトを作成します。次に、このオブジェクトをxmlにシリアル化し、xmlをファイルに追加できます。
  3. ファイルを読み取っているときに、同様のロジックを適用して最初にリストを読み込んだ後、diffを順番に適用しなければならないことがあります。
  4. ファイルに継続して追加する必要があるため、ファイルにルート要素を含めるべきではありません。言い換えれば、diff情報を持つファイルは有効なxmlドキュメントではありません。一連のxmlフラグメントを含んでいます。それを読むには、これらのフラグメントをxml宣言とルート要素で囲む必要があります。
  5. いくつかのバックグラウンドタスクを使用して、リスト全体を定期的に書き込んで、有効なxmlファイルを生成することができます。この時点で、あなたはdiffファイルを破棄することができます。アイデアは、トランザクションシステムを模倣することです.1つのデータ構造は、シリアル化された/情報を保存した後、変更を含む別の構造(トランザクションログに似ています)です。
0

パフォーマンスが問題になる場合は、DataContractSerializer以外を使用してください。

http://blogs.claritycon.com/kevinmarshall/2010/11/03/wp7-serialization-comparison/

でのオプションの良い比較は、リストのサイズが懸念される場合は、小さいリストに分割することも試みることができるがあります。これを行う最も適切な方法は、あなたのリストのデータと典型的な使用/編集/追加パターンに依存します。

データが変更される頻度によっては、変更するたびに保存してみることもできます。これにより、非アクティブ化に利用可能な時間内にそれを保存する必要がなくなります。

関連する問題