ASP.NET - 在Viewstate中保存而不进行序列化

San*_*ile 5 c# asp.net viewstate serialization

我试图在Viewstate中存储一个复杂的对象,以避免每次在页面加载时调用它.我知道它需要序列化才能从Viewstate保存和重新审核,这意味着我的类应该标记为 [Serializable]

这是一个相当复杂的实体,基本上我希望避免将每个类标记为Serializable,因为它可能会影响我用于映射的其他依赖项.

Class Article
{
    Albums albumList { get; set; }
    Authors authorList { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

它是否可能,是否有任何可能的方法来保存和检索没有序列化的视图状态对象?

Ern*_*sto 4

在我看来,从您的用例来看,“避免每次在页面加载时调用它”都需要缓存。我认为如果你希望它过期,也许可以设置一些依赖项,它可能比会话更好(我们不知道所有细节)。

现在,您可以使用json.net,它可以帮助您序列化信息,而无需更改对象。只是不要滥用视图状态,如果让它增长,它会变得非常快。从长远来看,使用会话或缓存(如果它适合您的需求)可以更好地扩展。

如果这是显示内容,还请查看输出缓存,因为也许您可以在用户控件或其他内容中分离重复的内容。

总而言之,我想添加一个小例子,说明您使用 JSON.net 实际询问的内容(从他们那里窃取的示例):

//Doesnt need to be marked as serializable
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[] { "Small" };
//Use this string to save into view state
string json = JsonConvert.SerializeObject(product);
ViewState["something"]=json;
Run Code Online (Sandbox Code Playgroud)

之后,从 ViewState[something] 获取字符串并反序列化它。

string json = (string)ViewState["something"];
Product m = JsonConvert.DeserializeObject<Product>(json);
Run Code Online (Sandbox Code Playgroud)

警告,未编译就编写的代码。