DataContractJSONSerializer嵌套包含列表的DataContract对象

时间:2012-06-27 21:07:11

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

背景:我们正在使用一个属性,当传递某些标头时,该属性会将响应的输出更改为JSON对象。传递适当的accept头时,另一个属性返回XML。如果缺少accept标头或“html”,则返回测试页。

我需要能够像这样序列化对象结构:

[DataContract]
public class ResponseModel
{
   [DataMember]
   public bool Success { get; set;}

   [DataMember]
   public dynamic Data { get; set; } //I have tried "Object" as well

   [DataMember]
   public ApiErrorModel Error { get; set; } 

}

//for reference
[DataContract]
public class ApiErrorModel 
{
    [DataMember]
    public string ErrorCode { get; set; }

    [DataMember]
    public string ErrorMessage { get; set; }
}

我遇到的问题是当我无法测试任何错误状态时,它会序列化这样的结构:

[DataContract]
public class DatabaseModel
{
   [DataMember]
   List<Database> Database { get; set; }
   //snip implementation
}

[DataContract]
public class Database
{
   [DataMember]
   [Required]
   public string DatabaseName { get; set; }

   [DataMember]
   List<Guid> APITokens { get; set; }

   //snip other fields..., Guids and strings...
}

失败了,给了我错误:

输入'[namespace] .Api.Business.Web.Models.DatabaseModel',数据合约名称为“DatabaseModel:http://schemas.datacontract.org/2004/07/ [namespace] .Api.Business.Web。不期望模型'。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我已经研究过使用DataContractResolver,但我似乎无法使用它的JSON版本。切换到JSON.NET或JavaScriptSerializer序列化程序可能更容易,但它也需要适用于XML(这可能是特定于JSON的问题)。我想知道是否有办法解决这个问题而不添加我将用于已知类型的序列化方法列表的每种类型的列表。

1 个答案:

答案 0 :(得分:0)

JSON.NET基本上就是这样。似乎DataContractJsonSerializer无法完成任务。