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