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

标签 c# .net xml serialization xml-namespaces

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

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

我的问题是如何在使用派生类时将其从子节点中删除?

我已经创建了我自己的序列化程序,它可以采用自定义命名空间或简单地忽略它们,并且它对根元素运行良好。

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

像这样:

<root>
  <elements>
    <element p3:type="XmlDerivedClass" xmlns:p3="{schema_url}" >
    </element>
  </elements>
</root>

至于我的类(class):

// 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

我尝试了一些常见的解决方案:

  • 使用 Namespace=""属性
  • 实现 XmlNamespaceDeclarations 属性(使用正确的空命名空间)
  • XmlRoot() 从基类移至派生类
  • XmlRoot() 更改为 XmlElement()

我将尝试在 List 上添加 XmlInclude 标记,看看它是否改变了什么。

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

如果有人对此有解决方案,我很乐意尝试。

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


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

PS2:对于任何拼写错误,我深表歉意,英语不是我的母语。

最佳答案

我不确定这是否是满足您需求的解决方案,因为它不是很好,但它可以工作并且看起来不太脏。

public abstract class Abs
{
    public int Data { get; set; }
}


public class A : Abs{}

public class B : Abs{}

[Serializable]
[XmlRoot(elementName: "name")]
public class Ser
{
    [XmlElement(elementName: "A")]
    public List<A> AList { get; set; }

    [XmlElement(elementName: "B")]
    public List<B> BList { get; set; }

    [XmlIgnore]
    public List<Abs> AbsList {
        get
        {
            var list = new List<Abs>(AList.ConvertAll(x=>(Abs)x));
            list.AddRange(BList.ConvertAll(x=>(Abs)x));
            return list;
        }
    }
}

代替 XmlInclude,您可以创建一个包含派生类对象的列表,然后将它们添加在一起,或者可能将它们缓存在私有(private)成员中。 请再次注意,这仍然远非理想,但它对我有用,所以我想分享它。

关于c# - XmlSerializer + 抽象类 + 派生类 = 无用的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20263952/

相关文章:

c# - 位置 0 查询没有行

C# 用数字对数组列表进行排序

c# - 线程和 Winforms 表单重绘

java - 使用 jaxb 更改 xml 结构

xml - 无法指定 OfficeApp manifest.xml 的要求集

安卓 : edittext alert

c# - 是否可以将本地数据逐个加载到剑道网格中?

c# - 在哪里可以找到 Linq ThenInclude 方法?

.net - Npgsql Minimum Pool Size 似乎没有被考虑在内

c# - 我无法使用 INotifyPropertyChanged 更新我的值