带反序列化的C#ProgressBar()

时间:2011-03-20 23:14:32

标签: c# serialization progress-bar binaryformatter

我有一些我已经序列化的大型对象图,其中一些需要花一些时间来反序列化。

在这个阶段,我很满意我的小“请等待......”框出现,然后在完成时消失,但我只是想要在事件中有某种进度条。反序列化开始需要更长时间。

似乎没有任何方法可以获得Deserialize()对象的内置BinaryFormatter方法的进度。我怀疑有这样的功能被包含在内,会有某种异步回调,只要从流中读取一个字节块就会轮询。

有没有人看过使用对象序列化/反序列化实现类似ProgressBar的行为?

4 个答案:

答案 0 :(得分:2)

Stephen Toub在.NET Matters column of the December 2006 MSDN Magazine中讨论了解决这个问题的方法。

他在流周围实现了一个包装器,然后允许拦截Read方法并引发一个合适的事件来表示进度。

答案 1 :(得分:1)

我之前已经考虑过这个问题 - 我能想到的唯一方法就是将正在反序列化的Stream包装起来,并在Formatter读取它时跟踪位置。然而,这假设格式化程序在反序列化时线性且连续地读取,并且不能保证它会这样做。

答案 2 :(得分:1)

不,我没有。但是,您可以根据要反序列化的文件的大小来确定反序列化所需的时间,并将其用于进度条。这可能会给用户一些关于时间的指示,即使它不准确。

答案 3 :(得分:0)

由于我对大图的反序列化进行了一些性能测量,我发现:

  • 派生自ISerializable并且实施GetObjectData()可用作某种“圈计数器”,如果您对每种对象类型调用的次数进行估算
  • 实施IDeserializationCallback.OnDeserialization()根本无法使用,因为在加载所有内容后立即调用OnDeserialization

好吧,因为我还有大型对象图加载几秒钟,我将尝试使用第一种方法实现一些进度跟踪。如果你想了解它的一些信息,请给我打电话。

至于第一个建议,我不会尝试将其包装到Stream的某些后代,我宁愿使用另一个线程并检查原始源流LengthPosition并尝试从中创造一些进步。