【发布时间】:2011-02-10 00:51:40
【问题描述】:
目标:
XML 序列化一个对象,该对象包含该对象及其派生类型的对象列表。生成的 XML 不应使用 xsi:type 属性来描述类型,因为序列化 XML 元素的名称将是特定于派生类型的分配名称,而不总是基类的名称,这是默认行为。
尝试:
在探索 IXmlSerializable 和 IXmlSerializable 与怪异的 XmlSchemaProvider 方法和巫毒反射返回专门的模式和 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);
我已经断断续续地为此苦苦挣扎了好几个星期,但在任何地方都找不到答案。
【问题讨论】:
-
请发布生成的 XML。