2012-09-06 25 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); 
    // ... 
}