如何有条件地避免在WCF中序列化属性?

是否有可能动态避免序列化的属性? 假设我的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,我仍然想序列化这个属性。

如果我了解您的要求,以下内容应该有效。 ValueIfFlagTrue属性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属性。

申请并不容易。 您应该实现自定义序列化规则。 在您的情况下,您可以使用EmitDefaultValue并将小数声明为nullablenullable

 [DataContract] public class CompositeType { public bool _flag = true; [DataMember(EmitDefaultValue = false)] public decimal? Value { get; set; } } 

如果_flag为false,则应将Value设置为null。 如果Value为null,则不会序列化。 这对你来说更简单。