XmlSerializer将xsi:type替换为节点名称

Sib*_*Guy 9 .net serialization xml-serialization

目前XmlSerializer产生以下结构:

<config>
  <BaseType xsi:type="DerivedType1" />
  <BaseType xsi:type="DerivedType2" />
</config>
Run Code Online (Sandbox Code Playgroud)

有没有办法让它将类型名称放入节点:

<config>
  <DerivedType1 />
  <DerivedType2 />
</config>
Run Code Online (Sandbox Code Playgroud)

Tam*_*ely 26

使用XmlElementAttribute构造函数重载(string elementName, Type type).它允许您替换在成员中找到的实际类型的元素名称.如果您有多个派生类型,请将其中的几个堆叠在一起.

如果您尝试序列化List<Base>可能包含Derived实例的泛型集合,则以XmlArrayItem相同的方式使用它.

以这种方式定义也隐式地使派生类型已知,因此XmlInclude不需要属性

样本定义:

[XmlRoot]
public class Data
{
    [XmlElement("Derived1", typeof(Derived1))]
    [XmlElement("Derived2", typeof(Derived2))]
    public Base foo { get; set; }
    [XmlArrayItem("Derived1", typeof(Derived1))]
    [XmlArrayItem("Derived2", typeof(Derived2))]
    public List<Base> fooList { get; set; }
}

public class Base { ... }
public class Derived1 : Base { ... }
public class Derived2 : Base { ... }
Run Code Online (Sandbox Code Playgroud)


Ton*_*son 0

那么您可以使用 XmlElement 属性覆盖元素名称,例如

[XmlElement("DerivedType1")]
public BaseType : DerivedType1 {get;set;}
Run Code Online (Sandbox Code Playgroud)

if 仍然会输入 xsi:type ,并产生更大的混乱......

你的班级是什么样的?