.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
AFAIK、シリアライザーがの派生タイプを知らないことによって引き起こされる問題を解決するための3つの異なる方法がありPayment
ます。
1.クラス定義XmlInclude
への追加:Payment
これは、私が制御できない外部参照としてすべてのクラスが含まれているため、不可能です。
XmlSerializer
2.インスタンスの作成中に派生型の型を渡す
動作しません。
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
予期されていなかった...)がスローされることを意味します。
誰かがその主題に光を当てることができますか?どのようにして問題をさらにデバッグしますか?