zoukankan      html  css  js  c++  java
  • 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); }

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

  • 相关阅读:
    BZOJ1477 青蛙的约会
    Code Style
    线段树合并
    动态开点
    主席树
    启发式合并
    树的重心
    树的直径
    扩展欧几里得
    裴蜀定理
  • 原文地址:https://www.cnblogs.com/islee/p/2035590.html
Copyright © 2011-2022 走看看