[英]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
我試過一些常見的解決方案
我將嘗試在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.