如何标记 List 或 IEnumerable 可序列化?
Posted
技术标签:
【中文标题】如何标记 List 或 IEnumerable 可序列化?【英文标题】:How to mark a List or IEnumerable serializable? 【发布时间】:2017-06-25 05:26:25 【问题描述】:我有一个列表要存储在 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,版本=5.2.3.0,文化=中性,PublicKeyToken=31bf3856ad364e35]],mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089], [myproject.ModelStateSummary, myproject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 在程序集 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 未标记为可序列化。
我在将列表保存到 Session 时做错了吗?
【问题讨论】:
小心将大对象放入会话中。 【参考方案1】:当您将对象放入 Session 时,它会在那里被序列化。这也意味着不可序列化的对象不能存储在那里。然后,当您将其从会话中取出时,它会被反序列化。您不能反序列化为接口。它必须是一个具体的类。
var stateSummaries = Session["ModelStateSummaryModel"] as List<ModelStateSummary>;
【讨论】:
【参考方案2】:您可以像下面这样cast
。
var stateSummaries = (List<ModelStateSummary>)Session["ModelStateSummaryModel"];
【讨论】:
以上是关于如何标记 List 或 IEnumerable 可序列化?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.NET MVC 视图名称空间中使用 List 或 IList 代替 IEnumerable?
C# 列出 IList 或 IEnumerable 作为参数
如何将多个 IEnumerable<IEnumerable<T>> 列表添加到 IEnumerable<List<int>>