.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予期されていなかった...)がスローます。
誰もが主題にいくつかの光を当てることができますか?どのようにして問題を解決し、さらにデバッグしますか?