2009-11-17 30 views
1

如果我有10個不同的對象使用內部使用XmlSerializer的通用T類進行序列化/反序列化,那麼在反序列化時如何知道使用哪種類型?如何確定反序列化時的類型?

MyXmlSerializer.Deserialize<MyObject> (...) 

我怎樣才能知道MyObject?我所擁有的只是一個stringstream。

回答

3

你可以實現一個靜態方法來嘗試反序列化每種可能的。這樣您就不必中斷對象模型,以支持運行時類型發現。

您仍然需要對存儲在XML文件中的類型進行一些猜測。模擬XML文件序列化默認情況下不存儲詳細的類型信息。似乎應該有一個屬性,迫使序列化程序存儲詳細的類型名稱,但我找不到它...

public static bool TryDeserialize<T>(XmlReader reader, out T obj) where T : class 
{ 
    // Return null, if we can't deserialize 
    obj = null; 

    XmlSerializer deserializer = new XmlSerializer(typeof(T)); 
    bool result = deserializer.CanDeserialize(reader); 

    if (result) 
    { 
     // Get the object, if it's possible 
     obj = deserializer.Deserialize(reader) as T; 
    } 
    return result; 
} 
+0

你不需要屬性,只是通過已知類型的Ctor XmlSerializer的。 – 2009-11-17 12:46:59

+0

我看到了你的解決方案。你仍然需要找出你得到的類型,即如果(res.GetType()== typeof(Tst1))。我認爲使用上面的類型安全方法就像使用.Parse(..)語法一樣簡單。如果你不需要知道什麼類型是反序列化的,那麼你的方法更有意義。 – 2009-11-18 23:24:14

2

可以使用已知類型:

var ttt = new []{typeof(Tst1), typeof(Tst2)}; 
var ser = new XmlSerializer(typeof(object), ttt); 

// STEP 1 
ser.Serialize(File.CreateText("D:\\test.xml"), new Tst2()); 

// STEP 2 
var res = ser.Deserialize(File.OpenText("D:\\test.xml")); 

Console.WriteLine(res); 
相關問題