【问题标题】:Error serializing view model: "Type 'System.Web.HttpPostedFileWrapper' cannot be serialized."序列化视图模型时出错:“无法序列化类型‘System.Web.HttpPostedFileWrapper’。”
【发布时间】:2012-12-25 15:11:38
【问题描述】:

这是我的视图模型:

[Serializable]
public class MyViewModel
{
    public int VendorId { get; set; }

    public HttpPostedFileBase SpreadsheetFile { get; set; }       

    public IEnumerable<Vendor> Vendors { get; set; }        
}

我正在用数据加载我的视图模型并将其传递给视图并对其进行序列化:

@Html.Serialize("MyModel", myViewModel)

但我收到此错误

无法序列化类型“System.Web.HttpPostedFileWrapper”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果该类型是一个集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。

我不确定如何使用 DataContractAttribute 标记某些内容。有没有办法将 HttpPostedFileBase 属性标记为不可序列化?

【问题讨论】:

  • HttpPostedFileBase 是一个抽象类,因此您可能必须创建一个实现才能使某些东西可序列化。

标签: c# asp.net asp.net-mvc


【解决方案1】:

尝试将其标记为NonSerialized

[Serializable]
public class MyViewModel
{
    public int VendorId { get; set; }

    [NonSerialized]
    public HttpPostedFileBase SpreadsheetFile { get; set; }       

    public IEnumerable<Vendor> Vendors { get; set; }        
}

【讨论】:

  • 没有NonSerializable 属性,我尝试添加NonSerialized,但出现编译错误:属性'NonSerialized' 在此声明类型上无效。它仅对“字段”声明有效。
  • 我的错。谷歌太有帮助了。我搜索了 NonSerializableAttribute,结果最高的是 NonSerializedAttribute。
  • 属性“NonSerialized”在此声明类型上无效。它仅对编译时抛出的“字段”声明有效
【解决方案2】:

将 SpreadsheetFile 更改为具有支持字段的属性并将支持字段标记为 NonSerialized

[NonSerialized]
private HttpPostedFileBase _spreadSheetFile;
public HttpPostedFileBase SpreadsheetFile {
    get { return _spreadSheetFile; } 
    set { _spreadSheetFile = value; }
}

序列化程序将尊重支持字段上的属性。即使是自动实现的属性也有一个由编译器生成的支持字段。序列化程序使用支持字段,而不是属性。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多