2011-03-20 44 views
4

我有幾個大序列化的對象圖,其中一些需要一些時間去反序列化。帶反序列化的C#ProgressBar()

在這個階段,我很滿意我的小小的「Please Wait ...」框,它出現然後在完成時消失,但我只是想着在活動中有某種進度條的想法反序列化開始花費更長的時間。

似乎沒有任何方法可以獲得BinaryFormatter對象的內置Deserialize()方法的進度。我懷疑是否包含了這樣的功能,會有某種異步回調,只要從流中讀取一個字節塊就會進行輪詢。

有沒有人看到過使用對象序列化/反序列化的ProgressBar類行爲的實現?

+0

對於任何感興趣的人:我昨天實施了這個,對結果很滿意。反序列化發生在一個單獨的線程中,並且我假脫機一個額外的進度條線程監視流位置/流的長度並更新進度條。它工作得很好,並且給出了反序列化進度的相當好的近似值! – Ozzah 2011-05-27 04:13:55

回答

1

我以前曾經想過,我能想到的唯一方法就是將正在反序列化的Stream封裝起來,並跟蹤Formatter讀取的位置。然而,這假定格式化器在其反序列化時線性且連續地讀取,並且不能保證它的確存在。

+0

是的,我也想到了這一點! :) – Ozzah 2011-03-20 23:29:36

1

不,我沒有。但是,您可以根據反序列化文件的大小對反序列化花費多長時間進行假設,並將其用於進度條。這可能會給用戶一些指示,即使它不準確。

0

因爲我做了大圖的反序列化一些性能測試,我想通了,:

  • ISerializable繼承和實現GetObjectData()可以作爲某種「一圈櫃檯」,如果你建立一些估計每個對象類型將被調用多少次的次數
  • 實施IDeserializationCallback.OnDeserialization()完全不可用,因爲在加載EVERYTHING後立即調用OnDeserialization

那麼,因爲我也有大型對象圖加載幾秒鐘,我會嘗試使用第一種方法來實現一些進度跟蹤。如果你想了解它的一些信息,請給我打電話。

對於第一個建議,我不會試圖將其包裝成的Stream一些descendand,我寧願用另一個線程,並檢查原始源流LengthPosition並嘗試創建取得了一些進展。

+0

聰明的想法。謝謝:) – Ozzah 2011-05-11 01:16:53

2

Stephen Toub在.NET Matters column of the December 2006 MSDN Magazine討論瞭解決這個問題的方法。

他在流的周圍實現了一個包裝,然後允許攔截Read方法並引發一個合適的事件來表示進度。

+0

現在是2015年,爲什麼這不是.NET 4.5的標準部分? – Arunas 2015-04-23 02:59:46