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

Deserialize collection type virtual data member

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

JSON:

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

我的简单class图:

[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[] 时,一切正常。

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

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

[DataContext]
public class RequestWithDefault : BaseRequest
{
    [System.Runtime.Serialization.OnDeserialized]
    void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
    {
        if (Fields == null
            || Fields.Count < 1)
        {
            Fields = new List<string> { "test" };
        }
    }
}