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

C# 单个属性的自定义XML序列化,c#,xml,serialization,xml-serialization,C#,Xml,Serialization,Xml Serialization,我想将字符串[]类型的所有属性序列化为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 s

我想将字符串[]类型的所有属性序列化为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);
我有以下输出:

注意选项=op 1 op 2部分。如果我对输出进行反序列化,该值将被拆分为4个字符串,从而得到4个数组元素,而不是原来的2个

我想要的是能够为这个特定属性或任何字符串[]类型的属性运行自定义代码,以便控制输出。我不想覆盖整个类的序列化过程


如果这是不可能或太难用缺省的微软序列化器实现的,我将很乐意考虑一个更好的替代方案。

< P>如果它不一定是一个属性,那么只需将[XMLATRATITET]改为[XMLYMENT]

我强烈推荐上面的解决方案,因为序列化的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
    }
}

使用字符串方法:string csv=string.Join,,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
    }
}