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

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

我得到这个错误

Cannot convert type 'string' to 'testC' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

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

最佳答案

Is possible to get the object from cookie?

不,不是像您尝试的那样直接。不要考虑 ASP.NET。想一想 HTTP cookie在现实中。它是一个 HTTP header 。 HTTP header 只是纯字符串值。 HTTP 协议(protocol)中没有对象的概念。

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

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

反序列化是逆过程——你从 cookie 中读取值(它总是一个字符串),然后你 Base64 decode它变成一个字节数组,您可以使用 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);
        }
    }
}

关于c# cookie 无法将类型 'string' 转换为 'x',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996305/

相关文章:

asp.net 站点地图类使用另一个提供程序而不是 web.config 中的默认提供程序

javascript - 从 javascript 的内容页面调用 webservice

html - 在单元格内设置表格高度

javascript - setInterval 或 window.location 在 Opera、IE 和 Safari 中无法正常工作

asp.net-core - ASP .NET Core web api 在中间件中设置 cookie

python - cookie 和 token 的工作原理

c# - 禁用和隐藏 TabPage

c# - 如何关闭遮挡其他元素的永久元素?

c# - 如何在 ASP.NET 5 (MVC 6) 中添加 System.Web.Request 和 System.Web.Response 引用

c# - 如何从 .net Core 3.1 dll (WPF) 访问调度程序