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 が例外をスローすることです。だから私はxmlのようなものを持っている場合

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

type_new が無効であるため、デシリアライザーはエラーをスローします。

エラーをスローするのではなく、デシリアライザープロセスにフックしてそれをキャッチし、デフォルト値を設定する方法があるかどうか疑問に思っていました。無効な値がある場合は、それを「type1」に設定します

または、この問題の処理方法に関する提案を受け入れます

感謝と敬意

4

2 に答える 2

0

これは、デフォルト値を使用したC#XML逆シリアル化の複製である可能性があります

残念ながら、逆シリアル化中にデフォルトの列挙値にフォールバックする方法はないようです。少し手間がかかりますが、リンクされた例に従って、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 に答える