XmlSerializer +抽象类+派生类=无用的命名空间

Eth*_*nyl 7 .net c# xml serialization xml-namespaces

关于SO的第一个问题:,)它是关于XmlSerializer和命名空间问题的.

我知道如何从Xml文件的根元素中删除默认的Xml命名空间已经有很多主题,而且它不是主题.

我的问题是当你使用派生类时如何从子节点中删除它?

我已经创建了自己的序列化程序,可以使用自定义命名空间或只是忽略它们,并且它对根元素很有效.

但是当我使用抽象类在List中列出一些派生类时,序列化插入2属性在每个派生类的节点内.

像这样 :

<root>
  <elements>
    <element p3:type="XmlDerivedClass" xmlns:p3="{schema_url}" >
    </element>
  </elements>
</root>
Run Code Online (Sandbox Code Playgroud)

至于我的班级:

// Root element
[XmlRoot("root", Namespace="")]
public class XmlRootElement
{
    List<XmlBaseClass> _Elements;
}    

// Base class
[XmlInclude(typeof(XmlDerivedClass))] // Mandatory, prevents serialization errors
[XmlRoot(Namespace="")]
public abstract class XmlBaseClass

// Derived class
[XmlRoot("element", Namespace="")]
public class XmlDerivedClass : XmlBaseClass
Run Code Online (Sandbox Code Playgroud)

我试过一些常见的解决方案

  • 使用Namespace =""属性
  • 实现XmlNamespaceDeclarations属性(使用右空命名空间)
  • XmlRoot()从base clase移动到派生的clase
  • XmlRoot()更改为XmlElement()

我将尝试在List上添加XmlInclude标记,以查看它是否发生了变化.

到目前为止,没有任何方法可以删除那些该死的命名空间......

如果有人有解决方案,我会很高兴尝试.

[编辑21/02/2014] 好吧,我似乎是唯一一个面临这个问题的人.我将使用一个简单的string.Replace来删除无用的XML,但这很脏.


PS:对于上下文,标签对于另一端的解析器不是问题,但它们不是必需的,所以我正在寻找一种方法来删除它们.

PS2:对不起任何拼写错误,英语不是我的母语.

Pau*_*ner 0

如果添加[XmlType],则可以为序列化程序提供有关类型的信息,例如它所属的命名空间:

// Base class
[XmlInclude(typeof(XmlDerivedClass))] // Mandatory, prevents serialization errors
[XmlType(Namespace="")]
public abstract class XmlBaseClass

// Derived class
[XmlType("element", Namespace="")]
public class XmlDerivedClass : XmlBaseClass
Run Code Online (Sandbox Code Playgroud)