XML反序列化异常:<ArrayOfString xmlns="">不符合预期问题求助
解决XML反序列化时的
<ArrayOfString xmlns=""> was not expected异常 嘿,我来帮你搞定这个问题!先直接说核心原因:你反序列化时用错了序列化器的目标类型,和XML声明没关系~
问题根源
看你的反序列化代码:
XmlSerializer serializer = new XmlSerializer(typeof(string));
你创建的是用于序列化单个string的序列化器,但你实际序列化的是string[](字符串数组),所以XML里生成的是<ArrayOfString>节点。当序列化器看到这个节点时,它本来期望的是单个<string>,自然就抛出异常了。
解决方案步骤
1. 修正反序列化的序列化器类型
把typeof(string)改成typeof(string[]),让序列化器匹配数组类型:
// 修正后的反序列化代码 string taskCategoryFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "taskCategory.txt"); try { using (StreamReader reader = new StreamReader(taskCategoryFilePath)) { XmlSerializer serializer = new XmlSerializer(typeof(string[])); // 直接接收反序列化后的数组,不用提前初始化长度 string[] stringArray = (string[])serializer.Deserialize(reader); // 这里可以添加使用stringArray的业务逻辑 } } catch(Exception ex) { MessageBox.Show("There was an error loading the tasks:" + ex.ToString()); }
小提示:
- 不需要提前创建
string[] stringArray = new string[10];,反序列化会直接返回正确长度的数组Path.Combine可以直接拼接目录和文件名,不需要额外调用ToString()using块会自动关闭StreamReader,不用手动调用reader.Close()
2. 优化你的序列化代码(可选,但更高效)
你当前的序列化流程用了MemoryStream+XmlDocument的组合,其实可以简化,直接用StreamWriter写入文件,避免中间冗余步骤:
// 优化后的序列化逻辑示例(以TasksCategory为例) XmlSerializer serializer = new XmlSerializer(typeof(string[])); using (StreamWriter writer = new StreamWriter(taskCategoryFilePath)) { serializer.Serialize(writer, this.TasksCategory); } // 另外两个数组的序列化同理,重复这个逻辑即可
这样生成的XML和你之前的一致,但代码更简洁,性能也更好。
3. 关于XML声明的疑问
你担心的XML声明(<?xml version="1.0"?>)其实不是问题,这是XML的标准声明,序列化和反序列化都能正常识别。如果确实需要控制是否生成声明,可以用XmlWriterSettings:
XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; // 不生成XML声明 using (XmlWriter writer = XmlWriter.Create(taskCategoryFilePath, settings)) { serializer.Serialize(writer, this.TasksCategory); }
但这个步骤完全没必要,因为你的核心问题已经通过修正序列化器类型解决了。
异常补充说明
你看到的内部异常System.InvalidOperationException: was not expected,本质就是序列化器期望的节点(<string>)和实际XML里的节点(<ArrayOfString>)不匹配导致的,只要类型对应上,这个异常就会消失。
内容的提问来源于stack exchange,提问作者Williams
相关产品推荐
相关产品推荐

