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

时间:2018-01-15 17:24:11

标签: c# xml wcf serialization

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

2 个答案:

答案 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,则不会序列化。这对你来说会更容易。