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

本文关键字:实例化 派生 属性 序列化 XML | 更新日期: 2023-09-27 18:18:14

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

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

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

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

重要提示:假设序列化正确,XML序列化器将已经反序列化到正确的派生类。但是,如果由于某种原因,您的情况不是这样,那么您需要剩下的代码(foreach with switch语句)。

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;
        }
    }
}