1

在我的项目中,我需要构建一个应该向后兼容的通用反序列化器。示例: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 将抛出异常。所以如果我有像

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

反序列化器将抛出错误,因为 type_new 无效。

我想知道是否有一种方法可以连接到反序列化器进程来捕获它并设置默认值而不是抛出错误。说如果有任何无效值,那么我会将其设置为“type1”

或者愿意接受有关如何处理此问题的建议

谢谢并恭祝安康

4

2 回答 2

0

这可能是C# XML Deserialization W/Default Values的副本

不幸的是,在反序列化期间似乎没有办法回退到默认枚举值。这将需要更多的工作,但是如果您按照链接的示例并在 PolicyDef 类中实现 IXmlSerializable ,您将能够以类似的方式实现 ReadXml 方法(按顺序使用 try/catch 块反映每个属性检查默认值)。

希望有帮助!

于 2013-02-08T12:12:47.690 回答
0

感谢 Chris 的建议,但我不想最终编写完整的解析代码,如果 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 属性字段。

于 2013-02-08T19:30:12.113 回答