c# - WebAPI 序列化程序序列化基类而不是笨拙的子类

标签 c# serialization asp.net-web-api json.net datacontractserializer

我需要的类被序列化为 Web 服务响应主体。

问题是,基类的属性会随之序列化,而我无法为该服务提供序列化。

我需要阻止这些属性仅在这个子类上被序列化。所以我尝试使用 new 隐藏属性,但基类属性仍在序列化(即“Hello, world”在生成的 http 响应主体中):

public class MyBaseClass
{
    public string MyProperty { get { return "Hello, world"; } }
}

public class MyChildClass : MyBaseClass
{
    [XmlIgnore]
    [JsonIgnore]
    public new string MyProperty { get; set; }
}

这是通过这样的方式返回的:

return myHttpRequestMessage.CreateResponse(myStatusCode, myChildClassInstance);

那么两个问题

  • 这是怎么回事?为什么不用装饰品来表彰子类(class)?
  • 是否有另一种方法可以实现我想要实现的目标(防止装饰属性被序列化?

我知道这完全是一团糟,但在我有时间解决更深层次的问题(这是强制继承的操作)之前,这就是我必须处理的问题。

最佳答案

JSON

如果您使用的是 JSON.NET(这是 Web.API 中的默认 JSON 序列化程序),那么您可能需要使用自定义 ContractResolver。这个问题的答案 question有一个创建此类类的很好的例子。在以下示例中,我将使用其中一个答案中的 IgnorableSerializerContractResolver

现在您可以在 Global.asax 中注册它:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new IgnorableSerializerContractResolver()
    .Ignore<MyBaseClass>(x => x.MyProperty);

如果您已经在使用一些契约(Contract)解析器(例如 CamelCasePropertyNamesContractResolver ),那么您将需要以某种方式将它们组合起来。

XML

我不知道您使用的是什么类型(DataContractSerializerXmlSerializer)的 XML 序列化,但据我所知,DataContractSerializer 没有' 允许在运行时排除属性。您将需要使用 XmlSerializer。您可以为每种类型设置自定义序列化程序:

var xmlOver = new XmlAttributeOverrides();
var xmlAttr = new XmlAttributes { XmlIgnore = true };
xmlOver.Add(typeof(MyBaseClass), "MyProperty", xmlAttr);

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.SetSerializer<MyChildClass>(new XmlSerializer(typeof(MyChildClass), xmlOver));

简单的方式

如果您有权访问您的 MyBaseClass 并允许进行一些更改,那么您可以使用 Data 属性解决您的问题:

[DataContract]
public class MyBaseClass
{
    public string MyProperty { get; set; }
}

[DataContract]
public class MyChildClass : MyBaseClass
{
    [DataMember]
    public string MyProperty2 { get; set; }
}

在这种情况下,您可以使用默认的序列化程序(JSON.NET 用于 JSON,DataContractSerializer 用于 XML),它将自动为您解决。请注意,您必须DataContract 添加到MyBaseClass,否则XML 序列化将失败。

关于c# - WebAPI 序列化程序序列化基类而不是笨拙的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661474/

相关文章:

.net - ASP.NET Web API(测试版)是否可以与最新的 Mono(稳定版)一起运行?

asp.net-web-api - ASP.NET Web API - OWIN - TokenEndPointPath 在 IIS 中不起作用

c# - 如何将 Web n 层应用程序中的用户身份从用户界面层传递到数据访问层以进行审计?

c# - 匹配以 "the"或 "a"开头并以数字结尾的句子的一部分

c# - 使用 DirectorySearcher 检索某些属性不返回值

c# - (C#) 我能否以编程方式将 XLSX 单元格设置为图片/图像?

node.js - Neo4j 将数据序列化为 JSON

.net - 无法保留对数组或只读列表的引用,或从非默认构造函数创建的列表

c# - 错误 CS0266 : Cannot implicitly convert type 'object' to 'int'

c# - 如果模型类标记为可序列化,则参数值不会映射到 Web API 中