XmlInclude到(De)序列化单独程序集中的继承类型

时间:2010-06-25 00:39:43

标签: c# .net xml-serialization

我有这种情况:

namespace MyApp.Animals
{
  public class Dog : MyApp.Categories.Canine
  ...

所以我正在尝试序列化/反序列化狗类。不幸的是我不能使用[XmlInclude]属性,因为通过将它添加到父类(MyApp.Categories.Canine),我需要添加对父类所在的程序集的引用(MyApp.Animals)。但是由于继承,子类已经引用了父类...所以我们有一个循环引用。

有没有最佳实践方法来实现这一目标?我可以通过手动序列化/反序列化父类中存在的属性来解决它,并且只对子进行序列化,但这不是很优雅。

希望获得一些更好的提示..

更新:添加示例以回应John的评论......

我没有完整的代码示例(我正在使用的代码是庞大而复杂的),但是问题是应该对xml进行序列化/从xml序列化的某些属性包含在父类中,这是与子类不同的程序集。

将XmlElement属性添加到父类不起作用,因为我们实际上对子类进行了de / serialization,因此它不会迭代到父类。我们不能在父级上执行此操作,因为我们无法添加对子级的引用(因为子级已经引用了父级),因此de / serialiser将不知道要对哪个子级进行操作。

为了增加额外的复杂性,我遇到问题的对象实际上是通过父对象的以下属性进行de / serialized作为更大序列化的一部分:

    [XmlElement("ShippingAddress")]
    public Location ShippingAddress
    {
        get { return _shippingAddress; }
        set { _shippingAddress = value; }
    }

问题是这里的位置类型是子位置类型。因此,只有子类型中的属性被de / serialized ...父类型中的所有属性(也称为Location,但在不同的名称空间中)不是。

这会让它变得更清楚吗?

1 个答案:

答案 0 :(得分:1)

XmlSerializer有一个constructor,它接受​​一个名为“extraTypes”的类型数组。序列化和反序列化期间,此数组中的类型将可用,就像添加了XmlInclude属性一样。

var serializer = new XmlSerializer(typeof(Canine), new Type[] { typeof(Dog) });

更新:当类型与根对象上声明的类型不同时,如果您的Xml包含xsi:type属性,则该方法有效。听起来您可能只想将该属性反序列化为不同的类型。在这种情况下,您可以使用XmlAttributeOverrides替换原始类型的元数据。像这样构建XmlSerializer:

var overrides = new XmlAttributeOverrides();
var xmlAttributes = new XmlAttributes();
xmlAttributes.XmlElements.Add(new XmlElementAttribute("ShippingAddress", typeof(ITSM.Location)));
overrides.Add(typeof(Order), "Location", xmlAttributes);
var ser = new XmlSerializer(typeof(Order), overrides);

与使用以下内容替换Order.Location属性上的属性具有相同的效果:

[XmlElement("ShippingAddress", typeof(ITSM.Location))]