这个问题主要是因为我不熟悉数据流的操作所导致的,但 MSDN 上也没有提到此问题。
在实例化 MemoryStream 对象时 MSDN 提到 “流的 current position 是下一个读取或写入操作可能发生的位置。当前位置可以通过 Seek 方法检索或设置。在创建 MemoryStream 的新实例时,当前位置设置为零。”
在使用 ReadByte 方法时 MSDN 提到“如果读操作成功,则流内的当前位置将向前推进一个字节。如果发生异常,则流内的当前位置不变。”
但是在 WirteByte 方法中 MSDN 却没有提到任何相关位置改变的信息,根据 ReadByte 方法的说明同理 Wirte 方法,推测调用了 Wirte 后 Position 属性会置为最末一位,事实上我的流长度是 33081,Position 的值也就是 33081 确实是位置改变了,以前以为只有在读取时这个位置才会改变,看来写入也是同理的。
进行反序列化时就提示“在分析完成之前就遇到流结尾。”错误,因为我使用 Mdi 子窗体,导致这个错误信息无法直接看到,仅提示“调用的目标发生了异常。”,所以导致我绕了不少弯路,其实把 Mdi 方式先改为 ShowDialog 方式马上就能看到原因,所以只要重设数据流读取的起始位置即可:
using (MemoryStream stream = new MemoryStream()) {
byte[] bytes = Convert.FromBase64String(s);
stream.Write(bytes, 0, bytes.Length); stream.Seek(0, SeekOrigin.Begin); //必须设置流的起始位置,否则将报错 BinaryFormatter formater = new BinaryFormatter(); object o = formater.Deserialize(stream); }
有时想太多不如找最直接最简单的那个方法才是最有效的方法,就像这次,错误信息被屏蔽掉了,那么就应该去掉那个干扰源~