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

C#中如何让BasicDesignerLoader将List<string>序列化为可读XML而非二进制

问题解决方案

你遇到的序列化二进制输出问题根源是:.NET默认的组件序列化体系没有为泛型List<string>提供专门的XML序列化转换器,所以序列化器会回退到二进制序列化输出Base64内容。通过添加特性+少量辅助代码即可实现你要的可读XML输出,无需后处理:


方案1:自定义类型转换器+特性标注(保留List类型)

第一步:实现专用类型转换器

public class StringListConverter : TypeConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) || destinationType == typeof(string[]))
            return true;
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) && value is List<string> list)
        {
            var ctor = typeof(List<string>).GetConstructor(new[] { typeof(IEnumerable<string>) });
            return new InstanceDescriptor(ctor, new object[] { list.ToArray() });
        }
        if (destinationType == typeof(string[]) && value is List<string> strList)
        {
            return strList.ToArray();
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string[]))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string[] arr)
        {
            return new List<string>(arr);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

第二步:给属性加特性

修改你的属性定义,添加3个特性即可:

private List<string> _myStringsList = new List<string>();

[TypeConverter(typeof(StringListConverter))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[XmlArrayItem(ElementName = "Value")]
public List<string> MyStringsList
{
    get => _myStringsList;
    set => _myStringsList = value;
}

方案2:零自定义代码方案

如果可以接受少量业务代码适配,直接将属性类型替换为System.Collections.Specialized.StringCollection,该类型内置了序列化转换器,默认就会输出可读XML,仅需加[XmlArrayItem(ElementName = "Value")]特性即可指定子节点名称,无需自己实现转换器。

两种方案都可以直接输出你期望的<Value>子节点结构,不需要做XML后处理,反序列化逻辑也可以正常适配。

内容的提问来源于stack exchange,提问作者Jazimov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:21:00