[英]How to serialize an object containing an XML property
注意這是 .NET 4.8
我創建了這個示例代碼來說明問題
[XmlRoot(ElementName = "RESULT", Namespace = "", IsNullable = false)]
public class Result
{
public string Message { get; set; }
public XElement Stuff { get; set; }
public override string ToString()
{
var ser = new XmlSerializer(GetType());
using (var stream = new StringWriter())
{
ser.Serialize(stream, this);
return stream.ToString();
}
}
}
我會有一些XML
看起來像這樣
<FOO>
<BAR>Hello World</BAR>
<BAR2>Hello World</BAR2>
<BAR3>Hello World</BAR3>
</FOO>
這被分配給XElement Stuff
屬性,然后當Result
的一個實例被序列化時,您會得到這個 XML:
<?xml version="1.0" encoding="utf-16"?>
<RESULT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Message>Hello World</Message>
<Stuff>
<FOO>
<BAR>Hello World</BAR>
<BAR2>Hello World</BAR2>
<BAR3>Hello World</BAR3>
</FOO>
</Stuff>
</RESULT>
問題:有沒有辦法得到這個結果?
<?xml version="1.0" encoding="utf-16"?>
<RESULT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Message>Hello World</Message>
<FOO>
<BAR>Hello World</BAR>
<BAR2>Hello World</BAR2>
<BAR3>Hello World</BAR3>
</FOO>
</RESULT>
注意: FOO
可能是Stuff
- 我不在乎(因為我知道如何更改該名稱)我只是不希望序列化 XML 中的該屬性有兩層嵌套 XML
如果您願意對根名稱進行硬編碼,那么您可以為元素編寫一個包裝器類型並在其中實現IXmlSerializable
。
這可能比在Result
中實現更可取,因為我想真正的類型會有超過 2 個屬性。
一個快速而骯臟的例子——我將把ReadXml
的實現留給你(如果你需要的話):
public class ElementsWrapper : IXmlSerializable
{
public XElement[] Elements { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
}
public void WriteXml(XmlWriter writer)
{
foreach (var element in Elements)
{
element.WriteTo(writer);
}
}
}
並將您在Result
中的屬性更改為:
public ElementsWrapper FOO { get; set; }
使用時, Result
的序列化程序將寫入<FOO>
,然后委托給自定義序列化,然后寫入</FOO>
。
您可以在此處看到更新的小提琴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.