【问题标题】:c# cookie cannot convert type 'string' to 'x'c# cookie 无法将类型 'string' 转换为 'x'
【发布时间】:2012-10-21 08:47:41
【问题描述】:

我有这条鳕鱼:

 [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来设置和获取所有数据并创建一个新对象来获取?

【问题讨论】:

    标签: c# asp.net cookies


    【解决方案1】:

    是否可以从cookie中获取对象?

    不,不是像您尝试的那样直接。不要考虑 ASP.NET。想想HTTP cookie 在现实中是什么。它是一个 HTTP 标头。 HTTP 标头只是纯字符串值。 HTTP 协议中不存在对象的概念。

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

    .NET 中有不同的序列化程序可供您使用。例如,使用BinaryFormatterBase64 encode 将生成的字节数组存储到cookie 中。

    反序列化是逆过程 - 您从 cookie 中读取值(始终是字符串),然后将 Base64 decode 它转换为字节数组,然后使用 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);
            }
        }
    }
    

    【讨论】:

    • +1,请先生注意,Serialize&lt;T&gt;(T... 中的 T 通用参数未使用且不必要。很好的答案。
    • @gdoron,如果您不使用T 参数,您将如何定义Serialize 方法?像这样:string Serialize(object instance)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多