我有一些已序列化的大型对象图,其中一些需要一些时间来反序列化。
在这个阶段,我对我的小“请稍候...”框感到非常满意,它出现然后在完成时消失,但我只是在玩弄在反序列化开始时有某种进度条的想法更长。
似乎没有任何方法可以获取对象内置Deserialize()
方法的进度BinaryFormatter
。我怀疑如果包含了这样的功能,就会有某种异步回调,只要从流中读取一个字节块,它就会轮询。
你们中的任何人都见过使用对象序列化/反序列化实现类似 ProgressBar 的行为吗?
我有一些已序列化的大型对象图,其中一些需要一些时间来反序列化。
在这个阶段,我对我的小“请稍候...”框感到非常满意,它出现然后在完成时消失,但我只是在玩弄在反序列化开始时有某种进度条的想法更长。
似乎没有任何方法可以获取对象内置Deserialize()
方法的进度BinaryFormatter
。我怀疑如果包含了这样的功能,就会有某种异步回调,只要从流中读取一个字节块,它就会轮询。
你们中的任何人都见过使用对象序列化/反序列化实现类似 ProgressBar 的行为吗?
Stephen Toub 在2006 年 12 月 MSDN 杂志的 .NET Matters 专栏中讨论了解决此问题的方法。
他在流周围实现了一个包装器,然后允许拦截 Read 方法并引发一个合适的事件来表示进度。
我之前已经考虑过这个问题——我能想到的唯一近似方法是包装正在反序列化的 Stream 并在 Formatter 读取它时跟踪位置。然而,这假设格式化程序在反序列化时线性且连续地读取,并且不能保证它确实如此。
不,我没有。但是您可以根据要反序列化的文件的大小来假设反序列化需要多长时间,并将其用于进度条。这可能会给用户一些关于它将花费的时间的指示,即使它不准确。
由于我对大图的反序列化进行了一些性能测量,我发现:
ISerializable
和实现GetObjectData()
可以用作某种“计圈器”,如果您对每种对象类型将调用多少次建立一些估计IDeserializationCallback.OnDeserialization()
根本不可用,因为OnDeserialization
在加载所有内容后立即调用。好吧,因为我也有加载几秒钟的大型对象图,所以我将尝试使用第一种方法实现一些进度跟踪。如果你想了解它的进展情况,请联系我。
至于第一个建议,我不会尝试将其包装成 的某个后代Stream
,我宁愿使用另一个线程并检查原始源流Length
并Position
尝试从中取得一些进展。