反序列化集合类型虚拟数据成员

时间:2018-03-21 06:27:01

标签: c# json datacontractserializer datamember

我正在尝试将json反序列化为RequestWithDefault对象

JSON:

{
  "fields":["f1","f2"]
}

我的简单类图:

[DataContext]
public abstract class BaseRequest
{
  [DataMember]
  public virtual List<string> Fields { get; set; }
}

[DataContext]
public class RequestWithDefault : BaseRequest
{
  [DataMember]
  public override List<string> Fields {get; set; } = new List<string> {"test"}
}

将json反序列化为RequestWithDefault对象Fields后,属性包含["test", "f1", "f1"]。我想确保仅在请求中未指定Fields或指定为null时才应用此默认值。我怎么能这样做?我尝试使用[OnDeserializing]属性,但没有成功。结果是一样的

根据这个: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/collection-types-in-data-contracts 在反序列化期间看起来DataContractSerializer从集合中调用Add方法。这就是为什么我还有默认值和其他项目的原因。当我将List<string>替换为string[]时,一切正常。

1 个答案:

答案 0 :(得分:1)

似乎WCF序列化从不使用setter来设置具有集合类型的'Hello World'的值,而是使用DataMember代替。因此,检查Add是否具有任何值的唯一方法是在反序列化之后进行检查(而不是在反序列化时)。

fields