开发者

C# ProgressBar with Deserialize()

I have a few large object graphs which I have serialised, and some of them take a few moments to deserialise.

At this stage, I'm quite happy with my little "Please Wait..." box which appears and then disappears at completion, but I was just toying with the idea of having some sort of progress bar in the event that deserialisation starts taki开发者_运维知识库ng longer.

It doesn't seem like there's any way to get the progress of the built-in Deserialize() method for the BinaryFormatter object. I suspect that had such a feature been included, there would be some sort of asynchronous callback which would poll whenever a block of bytes was read from the stream.

Have any of you seen an implementation of ProgressBar-like behaviour with object serialisation/deserialisation?


Stephen Toub discusses an approach to this problem in the .NET Matters column of the December 2006 MSDN Magazine.

He implements a wrapper around the stream which then allows intercepting of the Read method and raising a suitable event to signal progress.


I've thought about this before- the only way that I can think of to even approximate it would be to wrap the Stream that is being deserialized and keep track of the position as the Formatter reads it. That assumes, however, that the Formatter reads linearly and continuously as it deserializes, and there is no guarantee that it does.


No I haven't. But you could make assumptions on how long the deserialization takes based on the size of the file you're deserializing and use that for your progress bar. This might give the user some indication on the time it will take, even though it's not accurate.


Since I did some performance measurements on the deserializing of the large graph, I figured out that:

  • deriving from ISerializable and implementing GetObjectData() could be used as some kind of a 'lap counter', if you establish some estimate on how many times it would be called for each object type
  • implementing IDeserializationCallback.OnDeserialization() isn't usable at all because OnDeserialization is called right after EVERYTHING is loaded.

Well, since I also have large object graphs that load for several seconds, I'll try to implement some progress tracking using first method. Ping me if you want some info on how it goes.

As for the first suggestion, I wouldn't try to wrap it up into some descendand of Stream, I would rather use another thread and examine original source stream Length and Position and try to create some progress from that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜