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
相关产品推荐
相关产品推荐

