簡體   English   中英

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

[英]ASP.NET - Saving in Viewstate Without serializing

我試圖在Viewstate中存儲一個復雜的對象,以避免每次在頁面加載時調用它。 我確實理解它需要序列化才能從Viewstate中保存和恢復,這意味着我的類應該被標記為[Serializable]

這是一個相當復雜的實體,基本上我希望避免將每個類標記為Serializable,因為它可能會影響我用於映射的其他依賴項。

Class Article
{
    Albums albumList { get; set; }
    Authors authorList { get; set; }
    ...
}

它是否可能,是否有任何可能的方法來保存和檢索視圖狀態對象而不進行序列化?

在我看來,從你的用例“避免每次在頁面加載時調用它”為緩存尖叫。 我想如果你希望它過期可能設置一些依賴,它可能比會話更好 (我們不知道所有的細節)。

現在,您可以使用json.net ,它可以幫助您序列化您的信息而無需更改您的對象。 只是不要濫用viewstate,如果你讓它成長,它會變得非常討厭。 使用會話或緩存(如果它符合您的需要)是可以長期更好地擴展的東西。

如果這是一個顯示事物,也可以看看輸出緩存,因為你可以在用戶控件或其他東西中分離你重復的內容。

總而言之,我想添加一個使用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;

之后,從ViewState [something]中獲取字符串並對其進行反序列化。

string json = (string)ViewState["something"];
Product m = JsonConvert.DeserializeObject<Product>(json);

警告,編寫代碼而不編譯它。

您可以使用ASP.NET Session對象(這可以避免序列化路由,因為Session所有內容都存儲為Object ),如下所示:

var theArticle = new Article();

Session["MyArticle"] = theArticle;

Session所有內容都存儲為對象,因此當您檢索Article對象時,您需要將其強制轉換為Article ,如下所示:

var myArticleFromSession = Session["MyArticle"] as Article;

注意:建議在嘗試訪問該值之前檢查Session密鑰是否確實存在,如下所示:

if(Session["MyArticle"] != null)
{
    // The key MyArticle exists, so it is safe to attempt to get the object value
    var myArticleFromSession = Session["MyArticle"] as Article;

    // Since we used as to attempt the cast, 
    // then myArticleFromSession will be null if the cast failed 
    // so check for null before using myArticleFromSession
    if(myArticleFromSession != null)
    {
        // Use myArticleFromSession here

    }
}

如果可能,應該避免序列化,因為它相對較慢(不能很好地擴展)。

如果您希望在回發之間或跨頁面緩存特定對象,請使用ASP.NET Session對象進行特定於會話的緩存,使用Application對象進行站點范圍的緩存,或者將System.Web.Caching.Cache用於您自己的緩存自定義緩存行為。 您還可以緩存ASP.NET頁面或頁面部分的輸出。 更多信息: ASP.NET緩存

但是,如果您要緩存整個頁面的視圖狀態,則可以選擇服務器端視圖狀態持久性。 在這種情況下,您需要創建一個新的BasePage 例如,當瀏覽器限制非常大的視圖狀態的大小時,這非常有用。 您可以在此處獲得有關此方法的更多信息: 服務器端Viewstate

另一種可能的解決方案是您可以將所有不需要的屬性映射為[NonSerialized]以便僅使用一次所需的屬性。 我有類似的問題,並選擇了這個選項。

因此,假設在上面的示例中您想要專輯而不是藝術家,那么您的課程將變為如下

[Serializable]
Class Article
{
    Albums albumList { get; set; }

    [NonSerialized]
    Authors authorList { get; set; }
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM