反序列化集合类型虚拟数据成员
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" };
}
}
}
我正在尝试将 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" };
}
}
}