首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlInclude (反序列化)在单独的程序集中序列化继承类型

XmlInclude (反序列化)在单独的程序集中序列化继承类型
EN

Stack Overflow用户
提问于 2010-06-25 00:39:42
回答 1查看 2.5K关注 0票数 2

我有这样的设想:

代码语言:javascript
复制
namespace MyApp.Animals
{
  public class Dog : MyApp.Categories.Canine
  ...

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

是否有实现这一目标的最佳做法?我可以通过手动序列化/反序列化父类上存在的属性,只对子类执行序列化,但这不是很优雅。

希望得到一些更好的建议。

更新:对John下面的评论添加到示例中.

我没有完整的代码示例(我正在处理的代码庞大而复杂),但问题是,应该从xml中反序列化的一些属性包含在父类中,父类与子类在不同的程序集中。

向父类添加XmlElement属性不起作用,因为我们实际上是在子类上进行反/序列化,所以它不会迭代到父类。而且我们不能在父节点上这样做,因为我们不能添加对子元素的引用(因为子元素已经在引用父节点),所以反序列化器将不知道该对哪个子节点执行操作。

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

代码语言:javascript
复制
    [XmlElement("ShippingAddress")]
    public Location ShippingAddress
    {
        get { return _shippingAddress; }
        set { _shippingAddress = value; }
    }

问题是,此处的位置类型是子位置类型。所以只有子类型的属性才会被反/序列化..。父类型(也称为Location,但位于不同的网络命名空间中)中的所有属性都不是。

这能让事情变得更清楚吗?

EN

回答 1

Stack Overflow用户

发布于 2010-06-25 04:06:26

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

代码语言:javascript
复制
var serializer = new XmlSerializer(typeof(Canine), new Type[] { typeof(Dog) });

Update:如果您的Xml包含一个xsi:type属性,当该类型与根对象上声明的类型不同时,这种方法就会奏效。听起来,您可能希望始终将该属性反序列化为不同类型。在这种情况下,可以使用XmlAttributeOverrides替换原始类型上的元数据。像这样构造XmlSerializer:

代码语言:javascript
复制
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属性上的属性替换为:

代码语言:javascript
复制
[XmlElement("ShippingAddress", typeof(ITSM.Location))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3114870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档