2009-11-17 24 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); 
相关问题