0

我现在明白我们不能反序列化未知类型。

但是,为了创建高效的代码,我不想创建一个反序列化的方法,该方法对不同类型有 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 实例化对象。但是,我可以确定类型是什么。

现在是使用工厂模式的理想时机吗?

4

2 回答 2

2

它可能是这样的

T Deserialize<T>(Stream s)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    return (T)ser.Deserialize(s);
}
于 2012-10-12T08:27:12.860 回答
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>();
于 2012-10-12T08:25:44.537 回答