关于网友提出的“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:
Convert.ToBase64String()
Convert.FromBase64String()
解决方案3: cookie里只能存入文本,且不是什么样的文本都能存入
先把二进制字节流转为base64string 再存入
读取操作相反
=======================
同意这种说法。
解决方案4: cookie里只能存入文本,且不是什么样的文本都能存入
先把二进制字节流转为base64string 再存入
读取操作相反
以上介绍了“datatable Datatable存入Cookie后反序列化报错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2799236.html