2013-10-08 38 views
6

我想反序列化我的XML以獲取一個動態創建的類型數組(使用codedom),之後我使用反射來加載該程序集並加載類型是動態創建的。當我嘗試對我的XML進行反序列化時(它獲得了這個動態生成類型的對象的集合),我不知道如何向序列化程序提供類型。如何反序列化爲動態類型

我的代碼示例:

 Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll"); 
     Type type = assembly.GetType("myDynamicType"); 

     string xmlstring = myXml.OuterXml.ToString(); 
     byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlstring); 
     MemoryStream ms = new MemoryStream(buffer); 
     XmlReader reader = new XmlTextReader(ms); 

     myDynamicType[] EQs; 
     XmlSerializer serializer = new XmlSerializer(typeof(myDynamicType[])); 
     EQs = (myDynamicType[])(serializer.Deserialize(reader)); 

所以,這裏的問題是,我不知道「myDynamicType」而寫的代碼。它將在運行時創建和編譯。

請幫忙。

+0

你知道在編譯時的類型雖然,或者你正在加載完全未知的程序集?你打算如何使用這些對象? –

+0

不,我不知道編譯時的類型。實際上,它將在運行時生成並編譯到程序集中。所以,你可以說我的程序集和我的'myDynamicType'在編譯時都是完全未知的。就進一步的使用而言,我將把這個數組傳遞給我的web服務,它將對這個集合執行一些操作。 – tavier

回答

8

這裏的技巧是對Type實例的Type.MakeArrayType()方法。無參數版本產生矢量類型,即typeof(Foo).MakeArrayType() === typeof(Foo[])。還有其他一些重載多維數組等

XmlSerializer serializer = new XmlSerializer(type.MakeArrayType()); 

不過:你會不會能夠在年底前將其丟;你將需要使用object[]或類似的(使用的引用類型數組方差):

EQs = (object[])(serializer.Deserialize(reader)); 
+0

謝謝馬克。但是,如果我將它轉換爲object [],我將無法將它傳遞給期望收集特定類型的Web服務。 – tavier

+0

@AshishAgrawal如果該類型是動態加載的,那麼您已經有問題了。無論你如何輸入,它都基本上是*這種類型。如果這種類型是靜態的,那麼坦率地說,所有這些都是毫無意義的。 –

+0

類型沒有靜態定義。其實,正如我所說的,我正在使用codedom來創建「myDynamicType」。所以,這個字符串是可變的,會根據用戶的一些輸入而改變。例如,如果用戶說我想創建一個Student類,那麼我的代碼就會變成如下形式:Student [] EQs; XmlSerializer serializer = new XmlSerializer(typeof(Student [])); EQ = EQ =(Student [])(serializer.Deserialize(reader));如果我在這裏製造混亂,請告訴我。 – tavier

0

我不知道什麼,我要說的是,你想要什麼,但:

可以」 T優反序列化作爲對象類型

object[] EQs; 
XmlSerializer serializer = new XmlSerializer(typeof(object[])); 
EQs = (object[])(serializer.Deserialize(reader)); 

如果對象類型是在編譯時定義(如你說)不應該有一個比特的碼,它定義了嗎?在這段代碼中,你只需將對象轉換爲你想要的類型?

的其他方式,一旦你有你的object[] EQs轉換如下:

 if(EQs.Lenght > 0) 
    { 
     Type t = EQs[0].GetType(); 
    } 

和現在使用的上漲Typeobject[] EQs轉換到右側Type

+1

「你不能將它反序列化爲一個對象類型」 - 不,基本上, 'XmlSerializer'需要知道它應該期待什麼 –

+0

@Vincent,實際上我正在使用codedom動態地(在運行時)創建該類型。這裏是我在運行時獲取類型的代碼(基於用戶的輸入)。 Type type = assembly.GetType(「myDynamicType」);所以,myDynamicType不是一個靜態定義的類型。 – tavier

+0

那麼它可以是什麼類型?我們談論它可能是字符串,它可能是數字。或者它可以是自定義類。 更重要的是,你需要計算/做它的東西嗎?如果只是從xml加載顯示一些字符串就足夠了。 – Vincent

相關問題