BindingList对象的XML序列化与反序列化在Mono环境(Ubuntu)下异常问题求助
解决Mono环境下BindingList XML序列化/反序列化异常的思路
首先,先帮你拆解一下问题里的几个关键疑点,再逐个给出排查和解决方向:
1. 先修正反序列化XML的语法错误
你提供的反序列化XML里,WeatherFile的属性写法明显有问题:
<WeatherFile file=""../MyFile.txt"" />
XML属性值不能用双引号嵌套,正确的写法应该是:
<WeatherFile file="../MyFile.txt" />
或者用单引号包裹避免转义:
<WeatherFile file='../MyFile.txt' />
这个语法错误很可能是Mono下解析崩溃的直接诱因——虽然Windows的.NET解析器可能对这类错误更宽容,但Mono的XML处理逻辑通常更严格,先把这个问题修复再测试。
2. 排查BaseBindingList的序列化适配问题
你用的是自定义的BaseBindingList<WeatherFile>而非原生BindingList<T>,Mono和.NET Framework对自定义绑定列表的序列化逻辑存在差异:
- 首先确认
BaseBindingList类是否标记了[Serializable],且正确继承了BindingList<T>的核心特性; - 你的
SiteItem中WeatherFiles属性只有getter没有setter,反序列化时无法给集合赋值,这会导致Mono的序列化器无法正确填充数据。建议补充setter:
[XmlElement("WeatherFile")] // 直接指定项的类型,而非整个列表类型 public BaseBindingList<WeatherFile> WeatherFiles { get { return BindingItems1; } set { BindingItems1 = value; } }
这样配置后,序列化会直接生成多个<WeatherFile>节点在<WeatherFiles>下,而非依赖Mono可能不兼容的<ItemArray>结构。
3. 手动实现IXmlSerializable绕过跨平台差异
如果自定义绑定列表的默认序列化在Mono下依然异常,最稳妥的方式是手动控制序列化逻辑,实现IXmlSerializable接口:
public class BaseBindingList<T> : BindingList<T>, IXmlSerializable { public XmlSchema GetSchema() => null; public void ReadXml(XmlReader reader) { var itemSerializer = new XmlSerializer(typeof(T)); reader.ReadStartElement(); // 逐个读取并反序列化列表项 while (reader.NodeType != XmlNodeType.EndElement) { var item = (T)itemSerializer.Deserialize(reader); Add(item); } reader.ReadEndElement(); } public void WriteXml(XmlWriter writer) { var itemSerializer = new XmlSerializer(typeof(T)); // 逐个序列化列表项 foreach (var item in this) { itemSerializer.Serialize(writer, item); } } }
这种方式完全绕过了Mono和.NET的默认序列化差异,直接手动处理XML节点的读写,能彻底解决跨平台适配问题。
4. 定位UriFormatException的隐藏诱因
报错里的UriFormatException有点奇怪——你的代码里并没有直接使用Uri类型,推测是Mono的XmlSerializer误将../MyFile.txt这类相对路径解析为Uri导致的。可以尝试:
- 把
WeatherFile的File属性拆分,用专门的序列化属性规避自动解析:
[XmlIgnore] // 忽略原属性的自动序列化 public string File { get { return "../MyFile.txt"; } set { relativeFileName = value; } } [XmlAttribute("file")] // 用单独的属性处理XML序列化 public string FilePathForXml { get { return File; } set { File = value; } }
- 测试时先用绝对路径代替相对路径,看是否还会触发Uri解析异常。
内容的提问来源于stack exchange,提问作者lmanceau
相关产品推荐
相关产品推荐

