c# - 階層 - xmlserializer 配列




静的に認識されない型を指定するには、XmlIncludeまたはSoapInclude属性を使用します。 (2)

私は、.NETのXmlSerializer使って作業するときに非常に奇妙な問題を抱えていXmlSerializer

次のクラスの例を考えてみましょう:

public class Order 
{
    public PaymentCollection Payments { get; set; }

    //everything else is serializable (including other collections of non-abstract types)
}

public class PaymentCollection : Collection<Payment>
{
}

public abstract class Payment 
{
    //abstract methods
}

public class BankPayment : Payment
{
    //method implementations
}

AFAIKでは、シリアライザが派生型のPayment知らないために発生したInvalidOperationExceptionを解決する3つの異なるメソッドがあります。

1. XmlIncludePaymentクラス定義に追加する:

これは、すべてのクラスが私がコントロールできない外部参照として含まれているために可能ではありません。

2. XmlSerializerインスタンスの作成中に派生した型の型を渡す

動作しません。

3.プロパティのデフォルトのシリアル化をオーバーライドするために、ターゲットプロパティのXmlAttributeOverridesを定義する( このSOの記事で説明されているように)

また動作しません( XmlAttributeOverrides初期化が続きます)。

Type bankPayment = typeof(BankPayment);

XmlAttributes attributes = new XmlAttributes();
attributes.XmlElements.Add(new XmlElementAttribute(bankPayment.Name, bankPayment));

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(Order), "Payments", attributes);

その後、適切なXmlSerializerコンストラクタが使用されます。

注:私はInvalidOperationExceptionBankPaymentが期待されていなかった... )がスローされたことを意味しません

誰かがその光景を見せてくれますか? どのようにして問題をデバッグしてデバッグしますか?


これは私のために働いた:

[XmlInclude(typeof(BankPayment))]
[Serializable]
public abstract class Payment { }    

[Serializable]
public class BankPayment : Payment {} 

[Serializable]
public class Payments : List<Payment>{}

XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});

ちょうど問題を解決しました。 長い間掘り下げた後、まったく同じ状況をカバーするこのSOの投稿が見つかりました。 それは正しい道で私を得た。

基本的に、 XmlSerializer派生クラスが余分な型として含まれている場合 、既定の名前空間を認識する必要があります。 これがどうして起こるのかについての正確な理由はまだ分かりませんが、今でもシリアル化が行われています。





xmlserializer