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

标签 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 我仍然想序列化这个属性。

最佳答案

如果我理解了您的要求,那么以下内容应该可行。 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 属性放在私有(private)属性上,因此无需公开公开 ValueIfFlagTrue 属性。

关于c# - 如何有条件地避免属性在 WCF 中序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48267916/

相关文章:

c# - 将 Azure 设置为不预编译源代码

c# - 将上下文与 UI 应用程序中引发的异常关联起来的推荐方法是什么?

jQuery、撇号和其他特殊字符

xml - Scala:XML 属性解析

wcf - 如何检查 WCF 是否已在 IIS 中注册

c# - 如何确保来自接口(interface)的事件确实被引发?

c# - 返回不同类型时是否建议使用多种方法?

java - 通过在java中搜索从xml节点获取值

c# - 为了使 UploadPhotoStream 操作中的请求成为流,该操作必须有一个类型为 Stream 的参数

c# - 使用 WCF OData 和 GetContinuation() 方法的服务器端分页