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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:32:12