You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:26:34