4

尝试使用“.net 反序列化 xml 一种多种已知对象类型”的各种组合进行搜索......但没有找到任何有意义的东西,我现在在这里。

我得到了可能发送给我的 5 个不相关对象中的 1 个(每个对象的架构不同),我需要将该 xml 反序列化为正确的对象。当然,对象的数量/类型会增长;-) 有没有办法让反序列化器将 xml 内容与对象匹配,也许是反射(只是猜测)?除了 xml 内容本身之外,我没有得到围绕序列化对象的任何外部 xml 包装器告诉我它是什么。这些是来自不同系统的消息,通知我事件、状态更改、新订单……

此时我正在考虑蛮力,xml阅读器寻找与我的已知项目之一唯一匹配的识别属性,然后从那里切换到使用适当的类型进行反序列化。这似乎不太优雅。

任何指导表示赞赏,G

4

2 回答 2

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 回答
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 回答