如何标记List或IEnumerable可序列化?

时间:2017-02-07 19:56:48

标签: c# asp.net-mvc

我有一个以SqlServer模式存储在会话中的列表。

[Serializable]
public class ModelStateSummary
{
    public string PropertyName { get; set; }
    public string[] ErrorMessages { get; set; }
}

设置会话

var list = new List<ModelStateSummary> {...};
Session["ModelStateSummaryModel"] = list;

但是当我尝试从会话中检索模型时

var stateSummaries = Session["ModelStateSummaryModel"] as IEnumerable<ModelStateSummary>;

我收到了一个错误,说,

  

异常类型:System.Runtime.Serialization.SerializationException异常消息:输入'System.Linq.Enumerable + WhereSelectEnumerableIterator 2[[System.Collections.Generic.KeyValuePair 2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Web.Mvc.ModelState,System.Web.Mvc,Version = 5.2.3.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 ],[myproject.ModelStateSummary,myproject,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'在Assembly'System.Core,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为序列化的。

将列表保存到会话中我做错了吗?

2 个答案:

答案 0 :(得分:4)

当您将对象放入Session时,它会在那里被序列化。这也意味着不能在那里存储不可序列化的对象。然后,当您将其从会话中删除时,它将被反序列化。您无法反序列化到接口。它必须是一个具体的类。

var stateSummaries = Session["ModelStateSummaryModel"] as List<ModelStateSummary>;

答案 1 :(得分:0)

您可以cast如下所示。

var stateSummaries = (List<ModelStateSummary>)Session["ModelStateSummaryModel"];