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



我需要的类被序列化为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);

所以两个问题

  • 怎么了?为什么它不用它的装饰品来纪念儿童班呢
  • 有没有另一种方法可以实现我想要实现的目标(即防止装饰的属性被序列化

我知道这是一个彻头彻尾的烂摊子,但在我有时间解决更深层次的问题(即强制继承的操作)之前,这就是我必须处理的问题。

JSON

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

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

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

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

XML

我不知道您使用的是哪种类型的XML序列化(DataContractSerializerXmlSerializer),但正如我所知,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序列化将失败。

为了忽略基类中的属性,您可以在派生类中重写此属性,并用JsonIgnoreAttribute:装饰它

public class MyBaseClass
{
public virtual string MyProperty { get { return "Hello, world"; } }
}
public class MyChildClass : MyBaseClass
{
[JsonIgnore]
public override string MyProperty { get; }
}

您得到一个空的json对象对其进行序列化:

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

相关内容

  • 没有找到相关文章

最新更新