我有一些我已经序列化的大型对象图,其中一些需要花一些时间来反序列化。
在这个阶段,我很满意我的小“请等待......”框出现,然后在完成时消失,但我只是想要在事件中有某种进度条。反序列化开始需要更长时间。
似乎没有任何方法可以获得Deserialize()
对象的内置BinaryFormatter
方法的进度。我怀疑有这样的功能被包含在内,会有某种异步回调,只要从流中读取一个字节块就会轮询。
有没有人看过使用对象序列化/反序列化实现类似ProgressBar的行为?
答案 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
的某些后代,我宁愿使用另一个线程并检查原始源流Length
和Position
并尝试从中创造一些进步。