我现在明白我们不能反序列化未知类型。
但是,为了创建有效的代码,我不想创建一个反序列化方法,该方法对于不同类型具有X量的重载。
EG,我的方法签名可能是这些(一个不断增长的列表)
static void deserialiseThis(Dog d)
{
Stream reader = new FileStream(@"C:\Documents and Settings\Name\Desktop\demo.xml", FileMode.Open);
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(d.GetType());
Dog d = (Dog)xs.Deserialize(reader);
DoSomethingDoggy(d);
}
static void deserialiseThis(Cat t)
{
//again but for cat
}
static void deserialiseThis(Mouse t)
{
//again but for mouse
}
这样做似乎更整洁
static void deserialiseThis<T>(T t)
{
//logic
}
或
static void deserialiseThis(Type t)
{
//logic
}
这个方法的问题是我无法使用T实例化对象。但是,我可以弄清楚类型是什么。
这是使用工厂模式的理想时间吗?
答案 0 :(得分:2)
可能是这样的
T Deserialize<T>(Stream s)
{
XmlSerializer ser = new XmlSerializer(typeof(T));
return (T)ser.Deserialize(s);
}
答案 1 :(得分:1)
我喜欢以下方法解决这个问题。希望你可以利用它。
您可以使用它来从流中获取XContainer:
using (var streamReader = new StreamReader(yourStream))
{
var xDocument = XDocument.Load(streamReader);
return xDocument;
}
而且你有非常好的扩展方法:
public static class XContainerExtensions
{
public static T Deserialize<T>(this XContainer xmlDocument)
{
var xmlSerializer = new XmlSerializer(typeof(T));
using (var reader = xmlDocument.CreateReader())
{
return (T)xmlSerializer.Deserialize(reader);
}
}
}
可以这样使用:
var dog = xDocument.Deserialize<Dog>();