背景:我们正在使用一个属性,该属性在传递某些标头时将响应的输出更改为 JSON 对象。另一个属性在传递适当的接受标头时返回 XML。如果缺少接受标头或“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.Models' 是没想到。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。
我已经使用 DataContractResolver 进行了研究,但我似乎无法让它与它的 JSON 版本一起使用。切换到 JSON.NET 或 JavaScriptSerializer 序列化程序可能更容易,但它也需要适用于 XML(这可能是 JSON 特定的问题)。我想知道是否有一种方法可以解决此问题,而无需将我将要使用的每种类型的列表添加到已知类型的序列化方法列表中。