如果我有10個不同的對象使用內部使用XmlSerializer的通用T類進行序列化/反序列化,那麼在反序列化時如何知道使用哪種類型?如何確定反序列化時的類型?
MyXmlSerializer.Deserialize<MyObject> (...)
我怎樣才能知道MyObject?我所擁有的只是一個stringstream。
如果我有10個不同的對象使用內部使用XmlSerializer的通用T類進行序列化/反序列化,那麼在反序列化時如何知道使用哪種類型?如何確定反序列化時的類型?
MyXmlSerializer.Deserialize<MyObject> (...)
我怎樣才能知道MyObject?我所擁有的只是一個stringstream。
你可以實現一個靜態方法來嘗試反序列化每種可能的。這樣您就不必中斷對象模型,以支持運行時類型發現。
您仍然需要對存儲在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;
}
可以使用已知類型:
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);
你不需要屬性,只是通過已知類型的Ctor XmlSerializer的。 – 2009-11-17 12:46:59
我看到了你的解決方案。你仍然需要找出你得到的類型,即如果(res.GetType()== typeof(Tst1))。我認爲使用上面的類型安全方法就像使用.Parse(..)語法一樣簡單。如果你不需要知道什麼類型是反序列化的,那麼你的方法更有意義。 – 2009-11-18 23:24:14