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
總結
以上是生活随笔為你收集整理的MemoryStream 反序列化的报错问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SL项目开发自定义控件封装之新建自定义控
- 下一篇: 软件架构经验总结