5

シリアル化したいくつかの大きなオブジェクト グラフがあり、それらのいくつかは逆シリアル化に少し時間がかかります。

この段階では、表示されて完了時に消える小さな「お待ちください...」ボックスに非常に満足していますが、逆シリアル化が開始された場合に何らかの進行状況バーを表示するというアイデアをいじっていました。より長いです。

オブジェクトの組み込みDeserialize()メソッドの進行状況を取得する方法がないようです。BinaryFormatterそのような機能が含まれていたとしたら、ストリームからバイトのブロックが読み取られるたびにポーリングする非同期コールバックのようなものがあると思います。

オブジェクトのシリアル化/逆シリアル化を使用した ProgressBar のような動作の実装を見た人はいますか?

4

4 に答える 4

4

Stephen Toub は、2006 年 12 月の MSDN Magazine の .NET Matters コラムで、この問題へのアプローチについて説明しています。

彼は、ストリームの周りにラッパーを実装します。これにより、Read メソッドをインターセプトし、進行状況を通知する適切なイベントを発生させることができます。

于 2012-08-27T05:42:39.853 に答える
1

いいえ、していません。ただし、逆シリアル化するファイルのサイズに基づいて逆シリアル化にかかる時間を推測し、それをプログレス バーに使用できます。これにより、正確ではありませんが、ユーザーは所要時間をある程度知ることができます。

于 2011-03-20T23:20:18.647 に答える
0

大きなグラフの逆シリアル化でいくつかのパフォーマンス測定を行ったので、次のことがわかりました。

  • オブジェクトタイプごとに呼び出される回数を推定する場合、派生ISerializableと実装GetObjectData()はある種の「ラップカウンター」として使用できます
  • すべてがロードされた直後に呼び出されるため、実装IDeserializationCallback.OnDeserialization()はまったく使用できません。OnDeserialization

さて、ロードに数秒かかる大きなオブジェクト グラフもあるので、最初のメソッドを使用して進行状況の追跡を実装してみます。進行状況についての情報が必要な場合は、私に連絡してください。

最初の提案に関しては、私はそれを の子孫にまとめようとはしません。Stream別のスレッドを使用して元のソース ストリームを調べLengthPositionそこから何らかの進歩を遂げようとします。

于 2011-05-10T13:48:46.550 に答える