.NETで作業しているときに非常に奇妙な問題が発生しました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
}
私の知る限り、シリアライザがInvalidOperationException
の派生型を認識していないことが原因で発生するを解決するには、3つの異なる方法がありPayment
ます。
1.追加するXmlInclude
にはPayment
、クラスの定義:
すべてのクラスが、私が制御できない外部参照として含まれているため、これは不可能です。
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
コンストラクターが使用されます。
注:によって機能しませんInvalidOperationException
(つまり、BankPayment
予期されていなかった...)がスローます。
誰もが主題にいくつかの光を当てることができますか?どのようにして問題を解決し、さらにデバッグしますか?