【问题标题】:How to mark a List or IEnumerable serializable?如何标记 List 或 IEnumerable 可序列化?
【发布时间】: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+WhereSelectEnumerableIterator2[[System.Collections.Generic.KeyValuePair2[[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 时做错了吗?

【问题讨论】:

  • 小心将大对象放入会话中。

标签: c# asp.net-mvc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以像下面这样cast

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

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 2015-02-15
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2011-12-06
      • 2012-08-24
      • 2017-02-21
      • 2015-11-10
      相关资源
      最近更新 更多