我有一个基类实例的XML,想要反序列化为派生类实例

时间:2018-01-11 19:08:43

标签: c# xml serialization derived-class base-class

我有一个基类实例的XML,我想反序列化它并最终得到一个派生类的实例不在基类中的属性将被设置为默认值。

我的示例类看起来像这样:

foreach()

我尝试序列化MyBaseClass的一个实例,然后反序列化,如下所示:

public class MyBaseClass
{
    public int MyProperty1 { get; set; }
}

public class MyDerivedClass : MyBaseClass
{
    public int MyProperty2 { get; set; }
}

这当然在最后一行中转换为MyDerivedClass失败了(不能向下转换),但是我该如何修复呢?我可以在反序列化中做一些事情来说它应该最终成为另一个类吗?

(我想避免编写复制每个属性的Copy方法,因为在我的实际代码中,我在基类中有很多属性。)

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

您不能像这样将基类强制转换为派生类。使用AutoMapper执行此操作的最简单方法,或者您可以为MyDerivedClass创建构造函数;

public class MyDerivedClass : MyBaseClass
{
    public MyDerivedClass()
    {

    }

    public MyDerivedClass(MyBaseClass b)
    {
        MyProperty1 = b.MyProperty1;
    }

    public int MyProperty2 { get; set; }
}

像这样回来;

var deserialized = (MyBaseClass)serializer.Deserialize(xmlReader);
return new MyDerivedClass(deserialized);

答案 1 :(得分:0)

感谢您的回答。 Automapper对我来说看起来有些过分,所以我通过使用XmlDocument修改我的XML来做到这一点:我创建了一个新的XmlDocument,其中MyDerivedClass作为顶级节点,然后从原始XML字符串导入MyBaseClass顶级节点下的所有内容。不是一般的解决方案,但在我知道我正在使用哪些课程的情况下为我工作。