xnl*_*l96 1 c# asp.net cookies
我有这个鳕鱼:
[Serializable]
public class testC
{
string sir;
public testC()
{
sir = string.Empty;
}
public string GetString
{
get { return sir; }
set { sir = value; }
}
}
public class cookieTest
{
testC test;
public cookieTest()
{
test = new testC();
}
public testC GetTestC
{
get
{
HttpCookie cookie = HttpContext.Current.Request.Cookies["test"];
test = cookie["first"] as testC;
return test;
}
set
{
HttpCookie cookie = new HttpCookie("test");
cookie.Expires = DateTime.Now.AddHours(8);
cookie["first"] = value.ToString();
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到这个错误
无法通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换将类型'string'转换为'testC'
可以从cookie获取对象吗?或者我必须将所有数据写入cookie以设置并获取所有数据并创建一个新对象来获取?
可以从cookie获取对象吗?
不,不是像你想的那样直接.不要以ASP.NET为例.考虑一下HTTP cookie实际上是什么.它是一个HTTP标头.HTTP标头只是纯字符串值.HTTP协议中不存在对象的概念.
因此,您需要将您拥有的.NET对象序列化为字符串,然后将其反序列化.
您可以使用.NET中的不同序列化程序.例如,使用BinaryFormatter然后Base64编码生成的字节数组以存储到cookie中.
反序列化是反向过程 - 您从cookie中读取值(始终是一个字符串),然后您将Base64解码为一个字节数组,您可以使用该字符串反序列化回原始对象BinaryFormatter
.
请记住,虽然Cookie的大小有限,但在不同浏览器之间会有所不同.所以不要指望将大型对象放入cookie中.该值将被剥离,您将获得损坏的数据.如果对象的序列化值大于2k个字符,我就不会使用它们.
让我们举例说明前面描述的过程:
public class cookieTest
{
testC test;
public cookieTest()
{
test = new testC();
}
public testC GetTestC
{
get
{
var cookie = HttpContext.Current.Request.Cookies["test"];
return Deserialize<testC>(cookie.Value);
}
set
{
var cookie = new HttpCookie("test");
cookie.Expires = DateTime.Now.AddHours(8);
cookie["first"] = Serialize(value);
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
}
private static string Serialize<T>(T instance)
{
using (var stream = new MemoryStream())
{
var serializer = new BinaryFormatter();
serializer.Serialize(stream, instance);
return Convert.ToBase64String(stream.ToArray());
}
}
private static T Deserialize<T>(string value)
{
using (var stream = new MemoryStream(Convert.FromBase64String(value)))
{
var serializer = new BinaryFormatter();
return (T)serializer.Deserialize(stream);
}
}
}
Run Code Online (Sandbox Code Playgroud)