首页 新闻 会员 周边

[求助]关于流的Write和Read操作

0
悬赏园豆:20 [已解决问题] 解决于 2012-06-12 15:34

在学习序列化的时候出现一个问题

protected void Unnamed1_Click(object sender, EventArgs e)
    {
        BOOK bo1 = new BOOK();
        bo1.dic.Add("hehe", "zhou");
        bo1.dic.Add("haah", "li");
        bo1.City = "chengdu";
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, bo1);
            ms.Flush();
            ms.Position=0;
            Byte [] bts=new Byte[ms.Length];
            ms.Read(bts, 0, (int)ms.Length);
            Session["se"] = bts;
        }
     
    }

protected void Button1_Click(object sender, EventArgs e)
    {

        Byte[] bts = (Byte[])Session["se"];
       
        using (MemoryStream ms = new MemoryStream())
        {
            ms.Position = 0;
             ms.Write(bts,0,bts.Length);
            BinaryFormatter bf = new BinaryFormatter();
           var book= (BOOK)bf.Deserialize(ms);//报错
           Response.Write(book.City + book.Age + book.river+book.dic["hehe"]);
        
        }
    }

一个button是来设置把bo1对象转换成Bytes数组,然后存在session中,后一个button用来读取这个对象,但是这样会报错的,错误信息是“End of Stream encountered before parsing was completed.”如果使用MemoryStream ms = new MemoryStream(bts)就不会报错了 我想知道直接把bts赋给MemoryStream的构造函数和用write方法写进去Memorystream有什么不一样吗?我记得前几天把一个记事本中的一串字符通过binarywrite写进一个memorystream,直接用binaryread.readchar()得到的字符串和记事本也不一样,是不是写的时候加入了额外的比如编码信息吗?

周念中的主页 周念中 | 初学一级 | 园豆:5
提问于:2012-06-12 11:52
< >
分享
最佳答案
1

dudu 真好 !我就是看温故知新学的流,吃饭时候想到了问题的原因:应该说用write和构造函数是一样的只是在ms.Write(bts,0,bts.Length);之后ms的position属性在最后,反序列化应该是从最开始读取才正确,所以需要在

var book= (BOOK)bf.Deserialize(ms);//报错之前加上ms.Position=0,试了 可以了

           

周念中 | 初学一级 |园豆:5 | 2012-06-12 12:49
其他回答(1)
0
收获园豆:20
dudu | 园豆:30994 (高人七级) | 2012-06-12 12:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册