MemoryStream 反序列化的报错问题

这个问题主要是因为我不熟悉数据流的操作所导致的,但 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); }

有时想太多不如找最直接最简单的那个方法才是最有效的方法,就像这次,错误信息被屏蔽掉了,那么就应该去掉那个干扰源~

转载于:https://www.cnblogs.com/islee/archive/2011/05/03/2035590.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值