XML序列化:根据属性值实例化派生类

时间:2011-12-17 17:50:57

标签: c# .net xml

关于XML序列化的另一个问题。我有一个Base课程,我从中继承了Derived1Derived2个类。我想从xml元素<base>反序列化它们,我想创建Derived1实例<base attr="1">Derived2实例if <base attr="2">。我该怎么做?请注意,我使用XmlSerializesXmlAttributeOverrides。谢谢

1 个答案:

答案 0 :(得分:0)

编辑:我完全修改了我的答案,以适应您的具体情况。假设您已经正确地序列化了基本列表,则下面的代码应该可以正常工作。

我通常不建议使用switch语句,因为它违反了OCP。多态性通常是一个更好的答案。但是对于快速而肮脏的解决方案,以及具有相对较少值(例如您的情况)的switch语句,这将起作用。

重要说明:假设事物序列化正确,XML序列化程序已经反序列化为正确的派生类。但是如果由于某种原因在你的情况下并非如此,那么你需要其余的代码(foreach with switch statement)。

private static void ImportDerivedClasses()
{
    List<Base> bases;
    string filePathAndName = @"c:\temp\SerializedBases.xml";

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open))
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Base>));
        bases = xmlSerializer.Deserialize(fileStream) as List<Base>;
    }

    // The rest of this is unnecessary if we originally serialized correctly.

    List<Base> deserializedBases = new List<Base>();

    foreach(Base baseClass in bases)
    {
        switch (baseClass.Attr)
        {
            case "1":
                deserializedBases.Add(new Derived1());
                break;
            case "2":
                deserializedBases.Add(new Derived2());
                break;
            default:
                // Log warning
                break;
        }
    }
}