c#cookie无法将'string'类型转换为'x'

时间:2012-10-21 08:47:41

标签: 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);
            }
        }
    }

我得到了这个错误

  

无法通过引用转换将类型'string'转换为'testC',   装箱转换,拆箱转换,换行或转换   类型转换

可以从cookie中获取对象吗?或者我必须将所有数据写入cookie以设置并获取所有数据并创建一个新对象来获取?

1 个答案:

答案 0 :(得分:7)

  

可以从cookie中获取对象吗?

不,不是像你想的那样直接。不要以ASP.NET为例。考虑一下HTTP cookie在现实中的含义。它是一个HTTP标头。 HTTP标头只是纯字符串值。 HTTP协议中不存在对象的概念。

因此,您需要将您拥有的.NET对象序列化为字符串,然后将其反序列化。

您可以使用.NET中的不同序列化程序。例如,使用BinaryFormatter然后Base64 encode生成的字节数组存储到cookie中。

反序列化是反向过程 - 你从cookie中读取值(它总是一个字符串),然后你Base64 decode将它变成一个字节数组,你使用{{1}反序列化回原始对象}}

请记住,虽然Cookie的大小有限,但在不同浏览器之间会有所不同。所以不要指望将大型对象放入cookie中。该值将被剥离,您将获得损坏的数据。如果对象的序列化值大于2k个字符,我就不会使用它们。

让我们举例说明前面描述的过程:

BinaryFormatter