我正在使用 C# 学习 ASP.net,我想知道我们是否可以在 cookie 中存储字符串以外的数据,例如日期/时间或十进制或双精度。
2 回答
您可以序列化为 astring
并反序列化回该类型的任何类型的数据都可以存储在 cookie 中。例如:Object
, DateTime
, Int
,Decimal
等。
这完全取决于您的编码逻辑;字符串几乎可以转换回任何东西,
- 目的
- 诠释
- 十进制
- 约会时间
- 参考您可能为来宾用户保留的任何临时表/值
是否可以从 cookie 中获取对象?
不,不是你想要的那样直接。不要考虑 ASP.NET。想一想HTTP cookie实际上是什么。它是一个 HTTP 标头。HTTP 标头只是纯字符串值。HTTP 协议中不存在对象的概念。
因此,您需要将拥有的 .NET 对象序列化为字符串,然后将其反序列化。
.NET 中有不同的序列化程序可供您使用。例如,使用BinaryFormatter然后Base64 编码生成的字节数组以存储到 cookie 中。
反序列化是逆过程——您从 cookie 中读取值(始终是字符串),然后Base64 将其解码为字节数组,然后使用BinaryFormatter
.
请记住,cookie 的大小是有限的,并且会因不同的浏览器而异。所以不要期望将大对象放入cookies。该值将被剥离,您将获得损坏的数据。如果对象的总序列化值大于 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);
}
}
}
信用与参考
数据始终存储为 type String
。但是,由于您是存储数据的人,因此您应该知道数据类型。因此,在读回数据时,您可以使用适当的转换函数来获取您需要的任何数据类型。