C#:如何利用System.Xml.Serialization将字符串集合序列化为单个XML属性?
问题
是否存在System.Xml.Serialization相关的XML特性,可将List<string>或普通string[]数组这类集合序列化为单个XML属性?
示例场景:
原类定义:
public class Test { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } // 需要添加何种特性? public List<string> Values { get; set; } = new List<string>(); }
实例化赋值:
Test test = new Test { Name = "foo", Values = new List<string>() { "a", "b", "c" } };
期望序列化后的XML:
<Test name="foo" values="a b c" />
需求类似HTML中class属性允许多个值用空格分隔的实现方式。
解决方案
System.Xml.Serialization没有直接支持集合类型作为XML属性的内置特性,因为XML属性本身只能存储单个字符串值。要实现这个需求,需要通过**代理属性(Proxy Property)**间接处理:
- 给原集合属性标记
[XmlIgnore],让序列化器忽略它; - 创建一个字符串类型的代理属性,标记
[XmlAttribute]指定目标属性名; - 在代理属性的
get和set方法中,完成集合与空格分隔字符串的双向转换。
完整实现代码
using System.Collections.Generic; using System.Xml.Serialization; public class Test { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } // 标记原集合为序列化忽略 [XmlIgnore] public List<string> Values { get; set; } = new List<string>(); // 代理属性,负责XML属性的序列化与反序列化 [XmlAttribute(AttributeName = "values")] public string ValuesAsString { get { // 将集合拼接为空格分隔的字符串 return Values == null ? string.Empty : string.Join(" ", Values); } set { if (string.IsNullOrWhiteSpace(value)) { Values = new List<string>(); return; } // 将空格分隔的字符串分割为集合,自动移除空元素 Values = new List<string>(value.Split(' ', StringSplitOptions.RemoveEmptyEntries)); } } }
序列化验证代码
using System.IO; using System.Xml.Serialization; var test = new Test { Name = "foo", Values = new List<string> { "a", "b", "c" } }; var serializer = new XmlSerializer(typeof(Test)); using var writer = new StringWriter(); serializer.Serialize(writer, test); Console.WriteLine(writer.ToString());
输出结果:
<?xml version="1.0" encoding="utf-16"?> <Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="foo" values="a b c" />
注意事项
- 如果集合元素本身包含空格,需要提前处理(比如替换为其他分隔符或转义),避免序列化后分割出错;
- 反序列化时,
StringSplitOptions.RemoveEmptyEntries可避免连续空格产生空字符串元素; - 若使用
string[]数组而非List<string>,只需修改代理属性的转换逻辑,将List<string>替换为string[]即可。
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

