簡體   English   中英

如何序列化包含 XML 屬性的 object

[英]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.

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