C#的Xml反序列化加上设计建议(C# Xml Deserialize plus design su

2019-10-17 17:10发布

在我的项目,我需要建立一个通用的解串器,应该是向后兼容的。 示例:XML是什么样子

<PolicyDef name = "sample" type="type1">
  <Options ......>
</PolicyDef>

“类型”是枚举 - PolicyTypes如

public Enum PolicyTypes
{
 type1 = 0,
 type2 = 1
}

所述PolicyDef类被定义为

[XmlRoot("PolicyDef")]
    public class PolicyDef
    {
        private string policyName;
        private PolicyTypes policyType;

        public PolicyDefinition()
        {         
        }

        [XmlAttribute]
        public string Name
        {
            get
            {
                return this.policyName;
            }
            set
            {
               this.policyName = value;

            }
        }      
        [XmlAttribute]
        public PolicyTypes Type
        {
            get
            {
                return this.policyType;
            }
            set
            {
               this.policyType = value;

            }
        }           
    }

这种方法的问题是,如果以后我把比1型或2型以外的任何类型,XMLDeserializer会抛出异常。 所以,如果我有像XML

<PolicyDef name = "sample" type="type_new">
  <Options ......>
</PolicyDef>

解串器将抛出误差type_new无效。

我不知道是否有一种方法可以钩到解串器过程中赶上并设置默认值,而不是抛出错误。 说,如果有任何无效的值,那么我将其设置为“TYPE1”

或者愿意接受建议关于如何处理这个问题

谢谢并恭祝安康

Answer 1:

这是可能的复制品C#XML反序列化W /默认值

不幸的是,似乎没有办法deserialisation期间依傍默认枚举值。 这将需要稍微多的工作,但如果你遵循链接的例子,在你PolicyDef类实现IXmlSerializable的,你就可以实现类似的方式ReadXml方法(为了使用try / catch块反映每个属性检查默认值)。

希望帮助!



Answer 2:

由于克里斯您的建议,但我不想写出来的完全解析代码可能是凌乱的,如果XML和相应的类是庞大而复杂的。 我还是使用了不同的方法。 我改变了所有的枚举字段的字符串。 在这种情况下,就不会有解析错误,然后暴露,将返回解析值枚举,如果解析失败,则返回默认枚举值的其它属性。 例如

private string policyName;
[XmlAttribute("Type")]
public string Type
{
    private get
    {
        return this.policyType;
    }
    set
    {
        this.policyType = value;
        try
        {
            this.PolicyType = (PolicyTypes)Enum.Parse(typeof(PolicyTypes), this.policyType);
        }
        catch(Exception)
        {
            this.PolicyType = PolicyTypes.DefaultPolicy;
        }
    }
}

public PolicyTypes PolicyType
{
    get;
    private set;
}

而使用类属性来访问值,而不是XML属性字段。



文章来源: C# Xml Deserialize plus design suggestions