您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> .NET >> datatable Datatable存入Cookie后反序列化报错

datatable Datatable存入Cookie后反序列化报错

来源:网络整理     时间:2016/7/19 8:36:46     关键词:datatable

关于网友提出的“datatable Datatable存入Cookie后反序列化报错”问题疑问,本网通过在网上对“datatable Datatable存入Cookie后反序列化报错”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:datatable Datatable存入Cookie后反序列化报错
描述:

错误如下:
二进制流“109”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改
代码如下:
DataTable dt = new DataTable();
dt.Columns.Add("UserID", typeof(System.String));
if (Request.Cookies != null && Request.Cookies["Users"] == null)
{
DataRow dr = dt.NewRow();
dr["UserID"] = "zhouwu";
dt.Rows.Add(dr);
//Serialize
IFormatter fm = new BinaryFormatter();
Stream sm = new MemoryStream();
fm.Serialize(sm, dt);
sm.Seek(0, SeekOrigin.Begin);
StreamReader reader = new StreamReader(sm);
string strCart = reader.ReadToEnd();
reader.Close();
HttpCookie hc = new HttpCookie("Users");
hc.Value = Server.UrlEncode(strCart);
Response.Cookies.Add(hc);
Response.Redirect(Request.Url.ToString());
}
else
{
//Now deserialise
string StrCartNew = Server.UrlDecode(Request.Cookies["Users"].Value.ToString());
byte[] bt = System.Text.Encoding.Default.GetBytes(StrCartNew);
Stream smNew = new MemoryStream(bt);
IFormatter fmNew = new BinaryFormatter();
dt = (DataTable)fmNew.Deserialize(smNew);
TextBox1.Text = dt.Rows[0][1] + "!";
}
请各位指点一下问题的所在!


解决方案1:


TRY:


            DataTable dt = new DataTable();
            dt.Columns.Add("UserID", typeof(System.String));
            if (Request.Cookies != null && Request.Cookies["Users"] == null)
            {
                DataRow dr = dt.NewRow();
                dr["UserID"] = "zhouwu";
                dt.Rows.Add(dr);
                dt.AcceptChanges();
                //Serialize
                IFormatter fm = new BinaryFormatter();
                Stream sm = new MemoryStream();
                fm.Serialize(sm, dt);
                sm.Seek(0, SeekOrigin.Begin);
                byte[] newbyte = new byte[sm.Length];
                sm.Read(newbyte, 0, newbyte.Length);
                string strCart = Convert.ToBase64String(newbyte);
               
                HttpCookie hc = new HttpCookie("Users");
                hc.Value = Server.UrlEncode(strCart);
                Response.Cookies.Add(hc);
                Response.Redirect(Request.Url.ToString());
            }
            else
            {
                //Now deserialise
                string StrCartNew = Server.UrlDecode(Request.Cookies["Users"].Value.ToString());
                byte[] bt = Convert.FromBase64String(StrCartNew);
                Stream smNew = new MemoryStream(bt);
                IFormatter fmNew = new BinaryFormatter();
                dt = (DataTable)fmNew.Deserialize(smNew);
                TextBox1.Text = dt.Rows[0][1] + "!"; 
            } 
解决方案2:

引用 6 楼 zhouwu0716 的回复:
引用 3 楼 hdt 的回复:
cookie里只能存入文本,且不是什么样的文本都能存入 
先把二进制字节流转为base64string 再存入 
读取操作相反 
 
没有base64string 这个方法!


Convert.ToBase64String()
Convert.FromBase64String()
解决方案3:

cookie里只能存入文本,且不是什么样的文本都能存入 
先把二进制字节流转为base64string 再存入 
读取操作相反 
=======================
同意这种说法。

解决方案4:

cookie里只能存入文本,且不是什么样的文本都能存入
先把二进制字节流转为base64string 再存入
读取操作相反


以上介绍了“datatable Datatable存入Cookie后反序列化报错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2799236.html

datatable相关图片

datatable相关文章