2012-09-06 23 views
4

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

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

我想在这一点上的蛮力,xml读者寻找唯一匹配我已知的一个识别属性项目,然后从那里切换到反序列化使用适当的类型。 这似乎不太优雅。

任何指导理解, ģ

回答

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 
+0

这不适合我。传递给XmlSerializer的构造函数的第一个类型参数应该匹配xml的根元素。 – Pradeep

+0

我必须纠正自己。这只有在串行器和解串器的第一个参数相同时才有效。例如,如果第一个参数是typeof(Message),那么这将导致序列化的xml具有一个根元素。如果xml处于预定义模式中,并且您无法控制它,那么这可能对您无效。 – Pradeep

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); 
    // ... 
}