いくつかの具体的な実装を持つ抽象クラスがあります。これは、別のシステムに送信するために XML にシリアル化する必要があります。これは正常に機能しています。ただし、同じ XML 構造を逆シリアル化できる必要もあります。どう頑張っても、これができないようです。私のクラス構造は次のとおりです。
抽象クラス:
[XmlIncludeAttribute(typeof(ConcreteFooOne))]
[XmlIncludeAttribute(typeof(ConcreteFooTwo))]
[XmlIncludeAttribute(typeof(ConcreteFooThree))]
[XmlRoot(ElementName = "FooData", Namespace="http://foo.bar")]
public abstract partial class AbstractFoo
{
// Some abstract props etc.
}
具体的なクラスの例:
public partial class ConcreteFooOne : AbstractFoo
{
// Some properties, constructor etc.
}
XML ルートの例:
<FooData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ConcreteFooOne" RequestResponse="Request" xmlns="http://foo.bar">
これが問題の場所であると思われるため、例として XML ルートのみを含めました。これで正常にシリアル化できますが、逆シリアル化で、抽象型を渡して逆シリアル化すると、もちろん、型「AbstractFoo」が抽象であることを示す例外が発生します。そのため、ロジックを変更して、代わりに具体的な型 (この場合は ConcreteFooOne) がシリアライザーに渡されるようにしました。「http://foo.bar'> は予期されませんでした」というメッセージが表示されます。これは、シリアライザーがルートノードがどうあるべきかわからないためだと思いますか?
これはすべての具体的な実装で同じであるため、抽象クラスで定義されたルートノードがあります。具体的なタイプは、「RequestResponse」属性によって定義されます (または、実際のタイプ名が得られるため、存在する場合は xsi:type 属性も機能します)。シリアライザーに抽象クラスから必要なものを取得させる方法はありますか、それとも完全に間違っていますか?
- クラス構造は、サード パーティが提供する一部の XML スキーマに非常に密接に基づいているため、あまり変更できないことに注意してください。
これについて誰かの助けを前もって感謝します。