私は次のようなオブジェクトを持っています:
public class Intent
{
public List<Entity> Updates { get; set; }
}
MSMQ を使用してメッセージとして渡すために、XML にシリアル化したいと考えています。Entity 型のリストには、Entity から継承するクラスのインスタンスをいくつでも含めることができます。たとえば、次のような場合があります。
public Person : Entity { /* ... */ }
public Vehicle : Entity { /* ... */ }
これまでに次のように定義した XmlMessageFormatter を使用しています。
XmlMessageFormatter _formatter =
new XmlMessageFormatter(new[] { typeof(T) });
この場合の T は (上記のように) Intent です。
問題は、コードが実際にシリアル化しようとすると、次の例外が発生することです。
The type CoreApi.Domain.Person was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
これは、 Person がエンティティの子クラスであるという事実を何らかの形でシリアライザーに伝える必要があるためだと思います。
基本的に複数の XmlInclude 装飾でエンティティを装飾する必要があるソリューションを見てきましたが、これは私のシナリオではエンティティの継承者のリストが大きく、成長する可能性があるため機能しません。新しい継承者が追加されるたびにこのリストを常に更新したくありません。
XmlSerializer を使用して既知の型のリストを渡す他のソリューションを見てきましたが、これに関する問題は、XmlMessageSerialiser を互換性のない XmlSerialiser インスタンスに置き換える必要があることです。