使用XmlElement属性时,在序列化期间重复虚拟属性

时间:2010-04-20 07:55:56

标签: .net xml-serialization

目标:

XML序列化一个对象,该对象包含该对象及其派生类型的对象列表。生成的XML不应使用xsi:type属性来描述类型,因为序列化XML元素的名称将是特定于派生类型的指定名称,而不是基类的默认行为。

尝试:

在使用怪异的XmlSchemaProvider方法和voodoo反射探索IXmlSerializable和IXmlSerializable后,在几天内返回专门的模式和XmlQualifiedName,我发现我能够使用简单的[XmlElement]属性来实现目标......差不多。

问题:

序列化时,重写的属性会出现两次。例外情况为“命名空间中的XML元素'overriddenProperty''已存在于当前范围内。使用XML属性为元素指定另一个XML名称或命名空间。”我尝试使用* Specified属性(请参阅代码),但它不起作用。

示例代码:

Class Declaration

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

[XmlInclude(typeof(DerivedClass))]
public class BaseClass
{
    public BaseClass() { }

    [XmlAttribute("virt")]
    public virtual string Virtual
    {
        get;
        set;
    }
    [XmlIgnore]
    public bool VirtualSpecified
    {
        get { return (this is BaseClass); }
        set { }
    }

    [XmlElement(ElementName = "B", Type = typeof(BaseClass), IsNullable = false)]
    [XmlElement(ElementName = "D", Type = typeof(DerivedClass), IsNullable = false)]
    public List<BaseClass> Children
    {
        get;
        set;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass() { }

    [XmlAttribute("virt")]
    public override string Virtual
    {
        get { return "always return spackle"; }
        set { }
    }
}

驱动:

BaseClass baseClass = new BaseClass() { 
    Children = new List<BaseClass>()
};
BaseClass baseClass2 = new BaseClass(){};
DerivedClass derivedClass1 = new DerivedClass() { 
    Children = new List<BaseClass>()
};
DerivedClass derivedClass2 = new DerivedClass()
{
    Children = new List<BaseClass>()
};

baseClass.Children.Add(derivedClass1);
baseClass.Children.Add(derivedClass2);
derivedClass1.Children.Add(baseClass2);

我已经打了几个星期不停地摔跤,无法在任何地方找到答案。

1 个答案:

答案 0 :(得分:2)

找到它。

解决方案:

使用[XmlIgnore]属性装饰重写的属性。正确的虚拟值仍然是序列化的。

班级宣言

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

[XmlInclude(typeof(DerivedClass))]
public class BaseClass
{
    public BaseClass() { }

    [XmlAttribute("virt")]
    public virtual string Virtual
    {
        get;
        set;
    }

    [XmlElement(ElementName = "B", Type = typeof(BaseClass), IsNullable = false)]
    [XmlElement(ElementName = "D", Type = typeof(DerivedClass), IsNullable = false)]
    public List<BaseClass> Children
    {
        get;
        set;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass() { }

    [XmlAttribute("virt")]
    [XmlIgnore]
    public override string Virtual
    {
        get { return "always return spackle"; }
        set { }
    }
}