簡體   English   中英

單個屬性的自定義XML序列化

[英]Custom XML serialization for a single property

我想將string []類型的所有屬性序列化為CSV。

例如,給定一個類:

public class Choice {
    [XmlAttribute]
    public string[] Options { get; set; }
}

和以下序列化代碼:

var choice = new Choice() { Options = new[] {"op 1", "op 2"}};
var serializer = new XmlSerializer(typeof(Choice));
var sb = new StringBuilder();
serializer.Serialize(new StringWriter(sb), choice);
Console.WriteLine(sb);

我有以下輸出:

<Choice xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Options="op 1 op 2" />

請注意Options="op 1 op 2"部分。 如果我反序列化輸出,則該值將分為4個字符串,從而為我提供4個數組元素,而不是原來的2個數組元素。

我想要的是能夠為此特定屬性(或string[]類型的任何屬性)運行自定義代碼,以便我控制輸出。 我不想覆蓋整個類的序列化過程。

如果使用默認的Microsoft Serializer不可能或太難實現,那么我很樂意考慮一個更好的選擇。

如果不是絕對必須是屬性,則只需將[XmlAttribute]更改為[XmlElement]

public class Choice
{
    [XmlElement]
    public string[] Options { get; set; }
}

我強烈推薦上述解決方案,因為序列化的xml更加整潔和精確,並且您依靠XmlSerializer后端進行所有解析,而不依賴於滾動自己的自定義解析。 如果絕對必須將其作為屬性,則可以忽略Options屬性,並將其包裝到另一個進行自定義分析的屬性中:

public class Choice
{
    [XmlIgnore]
    public string[] Options { get; set; }

    [XmlAttribute("Options")]
    public string OptionsSerialized
    {
        get { return ToCsv(Options); }
        set { Options = FromCSV(value); }
    }

    private string ToCsv(string[] input)
    {
       //implementation here
    }

    private string[] FromCsv(string[] input)
    {
       //implementation here
    }
}

暫無
暫無

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

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