首页 > 编程语言 >C#反序列化XML时提示XML 文档(1, 1)中有错误

C#反序列化XML时提示XML 文档(1, 1)中有错误

时间:2024-11-28 15:55:05浏览次数:9  
标签:XML xml C# new XmlSerializer 序列化 xmlSerializer

最近在反序列化一个XML时,遇到了如下报错:

 

XML 文档(1, 1)中有错误。

内部异常

XmlException: 根级别上的数据无效。 第 1 行,位置 1。

 

看描述应该是XML格式的问题,我把XML复制到新建的控制台程序,反序列化又是可以的。代码如下:

 1  internal class Program
 2  {
 3      static void Main(string[] args)
 4      {
 5          var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Response>\r\n  <Status>200</Status>\r\n  <Message>成功</Message>\r\n</Response>";
 6 
 7          XmlSerializer xmlSerializer = new XmlSerializer(typeof(Response));
 8          using (StringReader sr = new StringReader(xml))
 9          {
10              Response response = (Response)xmlSerializer.Deserialize(sr);
11          }          
13      }
14  }
15 
16  public class Response
17  {
18      public int Status { get; set; }
19 
20      public string Message { get; set; }
21  }

 

在Stackoverflow上找到一个解决方案,这里分享一下

 

原因如下:

Each Unicode character in a string is defined by a Unicode scalar value, also called a Unicode code point or the ordinal (numeric) value of the Unicode character. Each code point is encoded using UTF-16 encoding, and the numeric value of each element of the encoding is represented by a Char object.

 

大意来讲,就是XML里指定的是utf-8编码,.NET内部使用了utf-16编码。

1 <?xml version="1.0" encoding="utf-8"?>

 

 

解决方法如下:

使用Utf-8编码获取字节数组,再通过调用Deserialize的重载,将字节数组转换成流传进去。

1 XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
2 
3 var buffer = Encoding.UTF8.GetBytes(xml);
4 using (MemoryStream ms = new MemoryStream(buffer))
5 {
6     return (T)xmlSerializer.Deserialize(ms);
7 }

 

参考资料:

https://stackoverflow.com/questions/310669/why-does-c-sharp-xmldocument-loadxmlstring-fail-when-an-xml-header-is-included

标签:XML,xml,C#,new,XmlSerializer,序列化,xmlSerializer
From: https://www.cnblogs.com/zhaotianff/p/18574432

相关文章

  • 半导体制造领域中的粒子缺陷(Particle Defect)
    随着半导体技术的进步,制造过程中的质量控制已成为提高半导体器件性能和可靠性的核心。粒子缺陷不仅会显著降低器件的电气性能,例如导致电路短路或开路等故障,而且对器件的长期可靠性产生严重影响,从而增加了器件性能退化和失效的可能性。 Part1-引 言半导体制造行业是现代电......
  • 萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?
    在现代安防监控领域,对于数据存储和视频处理的需求日益增长,特别是在需要长时间、高稳定性监控的环境中,选择合适的存储设备和监控系统显得尤为重要。本文将深入探讨监控硬盘与普通硬盘的区别,并详细介绍海康私有化视频平台EasyCVR安防监控视频系统如何以其卓越的性能和功能,满足不同场......
  • Javascript中的==与===
    在JavaScript中,==和===运算符用于比较两个值。==运算符被称为相等运算符(EqualityOperator)。它会比较两个值是否相等,但在比较之前会进行类型转换(如果两个值的类型不同)。如果两个值在类型转换后相等,则返回true。===运算符被称为严格相等运算符(StrictEqualityOperator)。它......
  • [题解]CF1063B Labyrinth
    CF1063BLabyrinth~Codeforces数据范围较小,考虑使用搜索。由于向左向右的步数限制过大,我们只能用\(x,y\)进行记忆化,否则空间和时间都过不去。既然状态只有\(x,y\),我们就要让最优情况最先被遍历到,所以考虑BFS。我们考虑,对于\((x,y)\)状态来说,什么样的情况是最优的?显然,对于......
  • 【JUC】ConcurrentHashMap之computeIfAbsent
    ConcurrentHashMap之computeIfAbsentConcurrentHashMap的锁粒度更细publicclassTGestWordCount{publicstaticvoidmain(String[]args){demo(()->newConcurrentHashMap<String,LongAdder>(),(map,words)->......
  • Sort-Object 是 PowerShell 中用于对对象进行排序的 cmdlet(命令)。sort 是 Sort-Object
     在PowerShell中,sort其实是Sort-Objectcmdlet的一个简写。这里我会详细解释一下sort是什么,它是怎么工作的,以及为什么会有这样的设计。1. 是什么:Sort-Object是PowerShell中用于对对象进行排序的cmdlet(命令)。sort是Sort-Object的别名,这意味着你可以使用sort来......
  • 基于多目标哈里斯鹰算法及模型预测控制(MPC)的储能和风电平抑波动研究(Matlab代码实现)
     ......
  • 【LRC】Adobe Lightroom Classic软件下载安装与使用
    目录AdobeLightroomClassic软件简介一、软件简介1.1软件特点1.2适用人群1.3主要功能二、系统要求2.1硬件要求2.2操作系统要求2.3显示要求三、下载安装步骤3.1下载安装包3.2安装AdobeLightroomClassic软件简介AdobeLightroomClassic(简称LRC)是一款......
  • 前端技术对JavaScript的事件学习
    事件目录事件EventTarge接口事件模型Event对象事件类型EventTarge接口基本概念作用:EventTarget接口使得DOM元素和其他对象能够处理事件。通过该接口,可以绑定事件的监听函数,移除监听函数,以及触发事件。应用范围:不仅限于DOM节点,还包括一些需要事件通信的浏览器内置对象,如XMLH......
  • InheritableThreadLocal从入门到放弃
    作者:京东零售田超辉背景:一个上线了很久但是请求量很低(平均每天一两次)的历史功能突然出现空指针报错:  我们翻开代码定位到对应的报错代码:  结合堆栈和代码可以确定是由于bdIdJobMap的值为null导致往bdIdEmployeeJobMap这个map中putAll的时候空指针了。而bdIdJobM......