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

C# WebAPI序列化程序序列化基类而不是笨拙的子类,c#,serialization,asp.net-web-api,json.net,datacontractserializer,C#,Serialization,Asp.net Web Api,Json.net,Datacontractserializer,我需要的类被序列化为web服务响应体 问题是,基类中的属性会随它一起序列化,而我不能将其用于此服务 我需要阻止这些属性仅在这个子类上序列化。因此,我尝试使用new隐藏属性,但基类属性仍在序列化(即,“Hello,world”在生成的http响应正文中): 这将通过以下方式返回: 返回myHttpRequestMessage.CreateResponse(myStatusCode,myChildClassInstance) 所以有两个问题 怎么回事?为什么不用装饰物来纪念儿童班呢 有没有其他方法

我需要的类被序列化为web服务响应体

问题是,基类中的属性会随它一起序列化,而我不能将其用于此服务

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

这将通过以下方式返回:

返回myHttpRequestMessage.CreateResponse(myStatusCode,myChildClassInstance)

所以有两个问题

  • 怎么回事?为什么不用装饰物来纪念儿童班呢
  • 有没有其他方法可以实现我想要实现的目标(即阻止已修饰的属性被序列化)
我知道这完全是一个难题,但在我有时间解决更深层次的问题(即强制执行此继承的操作)之前,这是我必须处理的问题。

JSON

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

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

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

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

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

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

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

要忽略基类中的属性,您可以在派生类中重写此属性,并用以下内容装饰它:

您将获得一个空的json对象来序列化它:

Debug.Assert(Newtonsoft.Json.JsonConvert.SerializeObject(new MyChildClass()) == "{}");

如何初始化子类的实例?
[Serializable]
类上的声明?您的测试用例为Json.Net复制,但不是为
DataContractJsonSerializer
,后者优先于父属性序列化子属性。这有帮助吗?假设您使用的是Json.Net,这可能是相关的:我使用的是默认序列化程序,我认为它使用Json.Net来处理Json和datacontractserializer for xml。需要两者都支持。我先测试json,我没有专门尝试xml。@dbc这就是你说的吗?如果是xml,就可以了?@robert它只是
var childInstance=new ChildClass()
。没什么特别的。您需要XML的相同功能吗?我需要。我明天回到办公室后会尝试一下。
[DataContract]
public class MyBaseClass
{
    public string MyProperty { get; set; }
}

[DataContract]
public class MyChildClass : MyBaseClass
{
    [DataMember]
    public string MyProperty2 { get; set; }
}
public class MyBaseClass
{
    public virtual string MyProperty { get { return "Hello, world"; } }
}

public class MyChildClass : MyBaseClass
{
    [JsonIgnore]
    public override string MyProperty { get; }
}
Debug.Assert(Newtonsoft.Json.JsonConvert.SerializeObject(new MyChildClass()) == "{}");