簡體   English   中英

XmlSerializer +抽象類+派生類=無用的命名空間

[英]XmlSerializer + Abstract class + Derived classes = Useless namespaces

關於SO的第一個問題:,)它是關於XmlSerializer和命名空間問題的。

我知道如何從Xml文件的根元素中刪除默認的Xml命名空間已經有很多主題,而且它不是主題。

我的問題是當你使用派生類時如何從子節點中刪除它?

我已經創建了自己的序列化程序,可以使用自定義命名空間或只是忽略它們,並且它對根元素很有效。

但是當我使用抽象類在List中列出一些派生類時,序列化插入2屬性在每個派生類的節點內。

像這樣 :

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

至於我的班級:

// 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()從base clase移動到派生的clase
  • 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;
        }
    }
}

您可以使用派生類對象創建List,然后將它們一起添加或者將它們緩存在私有成員中,而不是XmlInclude。 請再次注意這仍然遠非理想,但它適用於我,所以我想分享它。

如果添加[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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM