如何強制.NET的XmlSerializer將xsi:type =「FooClass」添加到類型爲的成員/節點FooClass
?如何強制使用xsi:type屬性?
的方案是一種目前發佈的應用程序,其中在第1節:
- FooClass繼承FooBaseClass
- FooPropertyA是FooBaseClass
- FooPropertyB是FooClass
- FooBaseClass裝飾有[ XmlInclude(typeof(FooClass))]
- BazClass has FooBaseClass類型的成員Foo
- 所有成套的Baz。美孚是一個FooClass實例
- Baz.Foo的所有用途指望FooPropertyB(等等FooClass實例VS FooBaseClass)
的目標是:在保持刪除FooBaseClass完全推FooBaseClass成員成FooClass,反向序列化兼容性
問題:然後我失去了Baz.Foo序列化的xsi:type =「FooClass」屬性。
換句話說
public class BazClass
{
public BazClass()
{
Foo = new FooClass { A = 5, B = "Hello" };
}
public FooClass Foo { get; set; }
}
public class FooClass
{
public int FooPropertyA { get; set; }
public string FooPropertyB { get; set; }
}
需求XmlSerializer.Serialize輸出是
<Baz>
<Foo xsi:type="FooClass">
<FooPropertyA>Hello</FooPropertyA>
<FooPropertyB>5</FooPropertyB>
</Foo>
</Baz>
卸下FooBasClass是容易的,但隨後的XmlSerializer不再放置的xsi:type = 「FooClass」 上Baz/Foo等v.1 XmlSerializer.Deserialize實例化FooBaseClass實例,不設置FooPropertyB,並將其分配給父Baz實例的Foo屬性。因此,任何檢查Baz.Foo是FooClass還是直接強制轉換的代碼都會失敗。
的xsi:type屬性在其中是
public class BazClass
{
public BazClass()
{
Foo = new FooClass { A = 5, B = "Hello" };
}
public FooBaseClass Foo { get; set; }
}
public class FooClass : FooBaseClass
{
public string FooPropertyB { get; set; }
}
[XmlInclude(typeof(FooClass))]
public class FooBaseClass
{
public int FooPropertyA { get; set; }
}
我認爲簡單的答案是,你不能在第1節的代碼自動放置 - 至少在沒有實現我(XML)序列化或編寫自定義序列化代碼。不過,我接受很好的建議。同時我已經實施了一個變通辦法下面,並希望更優雅的東西,或者至少讓我以某種方式徹底刪除FooBaseClass。
BazClass
{
[XmlElement("Foo")]
public FooBaseClass XmlFoo { get { return Foo; } set { Foo = (StartPicture)value; } }
[XmlIgnore]
public FooClass Foo { get; set; }
}
FooClass : FooBaseClass
{
public int FooPropertyB { get; set; }
public string FooPropertyA { get; set; }
}
[XmlInclude("FooClass")]
FooBaseClass
{
}
工作就像一個魅力!第二組眼睛的值... :-) – 2009-12-22 18:20:40
當類型位於另一個名稱空間時不起作用。 – 2014-05-27 14:05:21
此聲明中的命名空間用於'type'屬性,而不是類型本身。如果你需要一個類型與元素本身不同的名稱空間,那麼我認爲你可以通過手動注入一個'xmlns'屬性(通過使用一個虛擬的'[XmlAttribute]'屬性)來以類似的方式破解它。 ,然後在typename中引用它。 – 2014-05-27 16:45:35