2009-06-05 65 views
1

嗯,我不確定是否正確地標題這個問題或正確地問這個問題,但在這裏。反序列化動態類型的XML /將字符串轉換爲System.Type

我已經有序列化的對象(以XML格式)存儲在數據庫中,還有一個字符串/ varchar指示了類型。

現在我這樣做(因爲我有不同類型的有限數量的)

Dim deserializer as XmlSerializer 
If datatable("type") = "widget1" then 
    deserializer = new XmlSerializer(GetType(Widget1)) 
elseif datatable("type") = "widget2" then 
    deserializer = new XmlSerializer(GetType(Widget2)) 
... 

我想這樣做

Dim deserializer as XmlSerializer 
deserializer = new XmlSerializer(MagicallyConvertToSystemDotType(datatable("type")) 

我是找錯了樹在這裏?

回答

2

您是否嘗試過使用Type.GetType?這需要一個字符串參數併爲該名稱返回一個類型。您可能需要向其提供有關簡單名稱「小部件」的更多信息,更多信息請參見全名。但從您的示例看來,它們應該都具有相同的名稱空間,因此不應該是一個很大的障礙。

0

另一種選擇,如果你想要一個實際的關鍵字類型一起工作,而不是一個變量類型可以用下面的(對不起我使用C#和我太累了,做VB轉換):

method in XmlSerializer like Deserialize(typestring, object); 
method in XmlSerializer like Deserialize<T>(object); 


public void Deserialize(string typestring, object obj) 
{ 
    MethodInfo deserialize = typeof(XmlSerializer) 
     .GetMethod("Deserialize", BindingFlags.Instance | BindingFlags.Public) 
     .MakeGenericMethod(new Type[] { Type.GetType(typestring) }); 
    deserialize.Invoke(this, new[] { obj }); 
} 
0

具體來說,我認爲你是在找這個代碼在這裏(注:我沒有在VB.Net很多工作,所以我希望一切有語法正確):

VB.Net:

// Get the type of object being deserialized. 
Dim t as Type = Type.GetType(typeNameString); 
// Make a new instance of the object. 
Dim o as Object = Activator.CreateInstance(t); 

C#:

// Get the type of object being deserialized. 
Type t = Type.GetType(typeNameString); 
// Make a new instance of the object. 
object o = Activator.CreateInstance(t); 

編輯(2009年10月26日,15:10 GMT-0600):本Type.GetType(字符串typeNameString)方法並不總是識別的類型如簡單的全名。這將是您的最佳利益,以確保並在您的參數字符串儘可能多的信息就可以了,如下:

VB.Net/C#:

typeNameString = objectSerialized.GetType().Namespace + ", " + objectSerialized.GetType().Name + ", " + objectSerialized.GetType().Assembly.FullName 

特別少,我剛結束了同樣的問題,並經過大量的研究,我終於想出了一個很好的解決方案來處理全部大部分這是動態的。我已將整個源代碼發佈到一個能夠序列化和反序列化對象的類中。任何類型不包含泛型或數組使用反射。隨意採取並使用它作爲你自己的。 如果有人決定添加對泛型和數組的處理,請發送給我一份更新的副本,以便我可以將其發佈回到我的博客(並且您將獲得榮譽提及; - )...)。它會遞歸地序列化所有的東西,並且在那裏也有一些特殊的編碼。

看一看,看看是否覆蓋你在尋找的一切:

http://maxaffinity.blogspot.com/2009/10/serialize-objects-manually.html

〜〜的md5sum

編輯(2009年10月27日14:38 GMT-0600):糾正了我的博客中有關班級的一些錯誤信息。