是否可以动态避免序列化属性? 假设我的WCF服务中有这样的方法:
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
return new CompositeType();
}
CompositeType看起来像这样:
[DataContract]
public class CompositeType
{
public bool _flag = true;
[DataMember]
public decimal? Value { get; set; }
}
当我调用GetDataUsingDataContract方法时,我正在返回CompositeType对象,然后通过WCF技术将其序列化为XML。如果_flag = true?
,是否可以避免序列化的Value属性我读到了[XmlIgnore],[IgnoreDataMember]等等,但我明白这将始终忽略序列化的属性,只有当flag = true时我才必须忽略。如果flag = false,我仍然想序列化这个属性。
答案 0 :(得分:1)
如果我了解您的要求,以下内容应该有效。属性ValueIfFlagTrue
仅用于序列化,可根据需要命名。您还没有说过要如何处理反序列化,所以我在实现中做了一个猜测:根据需要进行调整。
[DataContract]
public class CompositeType
{
public bool _flag = true;
public decimal? Value { get; set; }
[DataMember(Name = "Value", EmitDefaultValue = false)]
private decimal? ValueIfFlagTrue
{
get
{
return _flag ? Value : null;
}
set
{
_flag = value.HasValue ? true : false;
Value = value;
}
}
}
<强>已更新强>
您可以将DataMember
属性放在私有媒体资源上,因此无需公开公开ValueIfFlagTrue
媒体资源。
答案 1 :(得分:0)
申请并不容易。您应该实现自定义序列化规则。在您的情况下,您可以使用EmitDefaultValue
并将小数声明为nullable
。
[DataContract]
public class CompositeType
{
public bool _flag = true;
[DataMember(EmitDefaultValue = false)]
public decimal? Value { get; set; }
}
如果Value
为false,则应将_flag
设置为null。如果Value
为null,则不会序列化。这对你来说会更容易。