单个属性的自定义XML序列化

时间:2018-02-11 11:42:07

标签: c# xml serialization xml-serialization

我想将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无法实现或太难实现,我会很乐意考虑更好的选择。

1 个答案:

答案 0 :(得分:1)

如果它不一定是属性,那么只需将[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
    }
}