反序列化未知类型和工厂模式

时间:2012-10-12 08:21:14

标签: .net factory-pattern

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

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

这是使用工厂模式的理想时间吗?

2 个答案:

答案 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>();