如果我有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