目标:
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);
我已经打了几个星期不停地摔跤,无法在任何地方找到答案。
答案 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 { }
}
}