4

「.net デシリアライズ xml 1 つの多くの既知のオブジェクト タイプ」のさまざまな組み合わせで検索を試みましたが、意味のあるものは何も見つかりませんでした。

送信される可能性のある 5 つの無関係なオブジェクト (それぞれに異なるスキーマ) のうちの 1 つを取得し、その xml を正しいオブジェクトに逆シリアル化する必要があります。そしてもちろん、オブジェクトの数/タイプは増加します;-)デシリアライザーがxmlコンテンツをオブジェクト、おそらくリフレクション(推測)に一致させる方法はありますか? シリアル化されたオブジェクトの周りに、xmlコンテンツ自体以外に、それが何であるかを伝える外側のxmlラッパーはありません。これらは、イベント、ステータスの変更、新しい注文などを通知するさまざまなシステムから届くメッセージです...

この時点でブルートフォースを考えています.xmlリーダーは、既知のアイテムの1つに一意に一致する識別属性を探し、そこから適切なタイプを使用して逆シリアル化に切り替えます。それはあまりにもエレガントに見えません。

任意のガイダンスをいただければ幸いです、G

4

2 に答える 2

0

XML ルート要素名 (および/または名前空間) がオブジェクトの種類ごとに異なる場合は、XmlSerializer.CanDeserializeを使用してルート要素名をスキーマと照合して確認できます。

XmlSerializer appleSerializer = new XmlSerializer(typeof(Apple));
XmlSerializer bananaSerializer = new XmlSerializer(typeof(Banana));
XmlSerializer carrotSerializer = new XmlSerializer(typeof(Carrot));

XmlReader reader = XmlReader.Create(file);

if (appleSerializer.CanDeserialize(reader))
{
    Apple a = (Apple)appleSerializer.Deserialize(reader);
    // ...
}
else if (bananaSerializer.CanDeserialize(reader))
{
    Banana b = (Banana)bananaSerializer.Deserialize(reader);
    // ...
}
else if (carrotSerializer.CanDeserialize(reader))
{
    Carrot c = (Carrot)carrotSerializer.Deserialize(reader);
    // ...
}
于 2015-06-25T00:07:40.757 に答える
0

以下を使用します。

Stream xml; // Contains the XML to deserialize
XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(MyClass1), 
    new []{ typeof(MyClass2), typeof(MyClass3) }); // Add additional classes here
object obj = xmlSerializer.Deserialize(xml);

if(obj Is MyClass1)
{
    // Do something
}
else if (obj is MyClass2)
{
    // Do something
}
else if (obj is MyClass3)
{
    // Do something
}
// And so on for other classes
于 2012-09-06T01:40:53.370 に答える