Cookie中可以存储哪些类型的数据?

Oma*_*reo 12 c# asp.net

我正在使用C#学习ASP.net,我想知道我们是否可以在cookie中存储除字符串以外的数据,如日期/时间或小数或双精度.

PaR*_*RaJ 13

您可以序列化string并反序列化为该类型的任何类型的数据都可以存储在cookie中.例如:Object,DateTime,Int,Decimal,等.


这完全取决于你的编码逻辑; 字符串几乎可以转换回任何东西,

  • 宾语
  • 诠释
  • 十进制
  • 约会时间
  • 对于访客用户,可以保留对任何临时表/值的引用

可以从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)

信用与参考