DataContractSerializer读取XML报错:缺少带编码的XML声明,求解决
XML读取异常原因及解决办法
异常原因
问题出在XmlTextWriter默认不会自动写入包含编码信息的XML声明。你写入文件时指定了Encoding.Unicode(即UTF-16编码),但生成的XML文件开头缺少<?xml version="1.0" encoding="utf-16"?>这行声明。DataContractSerializer读取时,识别到文件不是UTF-8编码,又找不到编码声明来确定正确编码,因此抛出该异常。
解决办法
可以通过两种方式让写入的XML包含编码信息:
1. 给XmlTextWriter添加写入声明的代码
在序列化对象前调用writer.WriteStartDocument(),它会根据你指定的编码自动生成带编码信息的XML声明:
DataContractSerializer serializer = new(typeof(RMonitorSnapshot)); using (XmlTextWriter writer = new(fn, Encoding.Unicode)) { writer.Formatting = Formatting.Indented; // 保持缩进格式 writer.WriteStartDocument(); // 写入带编码的XML声明 serializer.WriteObject(writer, snapshot); writer.Flush(); }
2. 使用推荐的XmlWriter.Create替代过时的XmlTextWriter
XmlTextWriter已被标记为过时,更推荐用XmlWriterSettings配置编码和格式,它默认会自动写入正确的XML声明:
DataContractSerializer serializer = new(typeof(RMonitorSnapshot)); var settings = new XmlWriterSettings { Encoding = Encoding.Unicode, Indent = true, OmitXmlDeclaration = false // 显式设置不省略XML声明,默认值即为false,可省略此配置 }; using (XmlWriter writer = XmlWriter.Create(fn, settings)) { serializer.WriteObject(writer, snapshot); }
修改后生成的XML文件会包含正确的编码声明,读取时就能正常解析,不会再抛出异常。
内容的提问来源于stack exchange,提问作者Horst Walter
相关产品推荐
相关产品推荐

