XML序列化后,反序列化时出现错误

报错现象

System.InvalidOperationException: XML 文档(40, 11)中有错误。 ---> System.Xml.XmlException: 根级别上的数据无效。 第 40 行,位置 11。
在 System.Xml.XmlTextReaderImpl.Throw(Exception e)
在 System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
在 System.Xml.XmlTextReaderImpl.ParseDocumentContent()
在 System.Xml.XmlReader.ReadEndElement()
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderConfigs.Read3_Configs(Boolean isNullable, Boolean checkType)
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderConfigs.Read4_Configs()
--- 内部异常堆栈跟踪的结尾 ---
在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
在 System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
在 DetectSys.Configs.LoadConfig() 位置 E:\DefctFramework\code\submitDS\DetectSystem\DetectSys.BLL\Config.cs:行号 55

报错时,xml文件

查看了一下序列化的文件,在文件最后总是会多出一些垃圾字符导致反序列化错误
<?xml version="1.0"?>
<Configs xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Settings>
<Setter Key="AppTitle" Value="三维可视化" />
<Setter Key="WeatherCityName" Value="达州" />
<Setter Key="UavFlyCenterPoint" Value="107.204756400529,31.1305284689069,160.0" />
<Setter Key="SqlDbString" Value="Server=127.0.0.1;uid=root;Password=root;Database=d3videofusion" />
<Setter Key="IGetWeatherImpl" Value="WeatherPlugins.Impl.LocalWheather,WeatherPlugins.dll" />
<Setter Key="autoBallonLayers" Value="tmpLayer\建筑信息.lgd;tmpLayer\建筑信息2.lgd" />
<Setter Key="GlaFile" Value="Gla\qingdao.gla" />
<Setter Key="GlaFile2" Value="Gla\shiyan2.gla" />
<Setter Key="region1" Value="tmpLayer\1片区.lgd;tmpLayer\pianqu.lgd" />
<Setter Key="region2" Value="tmpLayer\2pianqu.lgd" />
<Setter Key="region3" Value="tmpLayer\3pianqu.lgd" />
<Setter Key="region4" Value="tmpLayer\4pianqu.lgd" />
<Setter Key="region5" Value="tmpLayer\5pianqu.lgd" />
<Setter Key="region6" Value="tmpLayer\6pianqu.lgd" />
<Setter Key="region7" Value="tmpLayer\7pianqu.lgd" />
<Setter Key="region8" Value="tmpLayer\8pianqu.lgd" />
<Setter Key="region9" Value="tmpLayer\9pianqu.lgd" />
<Setter Key="region10" Value="tmpLayer\10pianqu.lgd" />
<Setter Key="region11" Value="tmpLayer\11pianqu.lgd" />
<Setter Key="region12" Value="tmpLayer\12pianqu.lgd" />
<Setter Key="LastSelectedDir" Value="E:\DefctFramework\数据\cout8" />
</Settings>
<Catalogs>
<Catalog Key="PATH_IMAGE_ICON_LABEL" Value="Resource\images\IconLabel" />
<Catalog Key="PATH_FengKongQu" Value="tmpLayer\封控区.lgd" />
<Catalog Key="PATH_HeXinQu" Value="tmpLayer\核心区.lgd" />
<Catalog Key="PATH_JingJieQu" Value="tmpLayer\警戒区.lgd" />
<Catalog Key="PATH_IMAGE" Value="resource\images" />
<Catalog Key="PATH_FRAME" Value="resource\frame" />
<Catalog Key="PATH_THREEDLL" Value="ThreeDll" />
<Catalog Key="PATH_JingJieQu" Value="tmpLayer\警戒区.lgd" />
<Catalog Key="PATH_IMAGE" Value="resource\images" />
<Catalog Key="PATH_FRAME" Value="resource\frame" />
<Catalog Key="PATH_THREEDLL" Value="ThreeDll" />
<Catalog Key="key" Value="value" />
</Catalogs>
</Configs>Configs>

报错的直接原因是xml文件后面多了

 Configs>
这种现象我称之为 拖尾现象
注意,多出的垃圾字符是不是随意的,是有规律的。

分析问题

但是为什么会多呢

先检查序列化代码。代码如下

public void Save()
{
if (config != null)
{
if (!File.Exists(saveFile))
{
File.Create(saveFile).Close();
}
XmlSerializer serializer = new XmlSerializer(typeof(Configs));
using (FileStream stream = new FileStream(saveFile, FileMode.Open))
{
serializer.Serialize(stream, config);
}
}
}

经过分析,问题就出在文件的打开方式上。

FileMode.Open方式,会覆盖原始文件。如果新的对象长度小于原始对象长度,就会出现拖尾现象。

解决问题

把FileStream打开方式改为Truncate,问题解决

public void Save()
{
if (config != null)
{
if (!File.Exists(saveFile))
{
File.Create(saveFile).Close();
}
XmlSerializer serializer = new XmlSerializer(typeof(Configs));
using (FileStream stream = new FileStream(saveFile, FileMode.Truncate))
{
serializer.Serialize(stream, config);
}
}
}

tag

记录一次错误处理 (xml序列化和反序列化相关)的更多相关文章

  1. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...

  2. XML 序列化与反序列化

    XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...

  3. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

  4. C#的XML序列化及反序列化

    webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...

  5. .NET XML序列化与反序列化

    闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...

  6. XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.   为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...

  7. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...

  8. Windows phone 之XML序列化与反序列化

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  9. C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

随机推荐

  1. jvm 基础

    1. JDK 包含 java 程序设计语言,JVM, Java API类库. java 开发最小环境 2. JRE : Java API类库中java se API 子集和java 虚拟机(HotSp ...

  2. RSS工具关注期刊,方便快速获取及时大量的文献信息

    第一步: 第二步: 第三步: RSS : 很好的一个东西,到了中国,咋就水土不服了呢...

  3. syslog系统日志、事件日志分析、EventLog Analyzer

    syslog系统日志.事件日志分析.EventLog Analyzer Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设备.数据库以及 ...

  4. 728. Self Dividing Numbers

    class Solution { public: vector<int> selfDividingNumbers(int left, int right) { vector<int& ...

  5. 2018.12.31 bzoj3992: [SDOI2015]序列统计(生成函数+ntt+快速幂)

    传送门 生成函数简单题. 题意:给出一个集合A={a1,a2,...as}A=\{a_1,a_2,...a_s\}A={a1​,a2​,...as​},所有数都在[0,m−1][0,m-1][0,m− ...

  6. 2018.10.25 bzoj4350: 括号序列再战猪猪侠(区间dp)

    传送门 区间dp好题. 首先我们并不用把右括号拿进来一起dpdpdp,而是直接用左括号来dpdpdp. 然后定义状态fi,jf_{i,j}fi,j​表示区间[l,r][l,r][l,r]的合法方案数. ...

  7. eclipse 创建servlet 出现继承 HttpServlet 报红线

    eclipse创建servlet出现红线: 解决方案1,鼠标右键项目 -> 鼠标右击项目——>Build Path——> 点击comfigure Build Path进入-----& ...

  8. CodeForces 946D Timetable (DP)

    题意:给定 n,m,K,表示某个人一个周有 n 天,每天有 m 节课,但是他可以跳过 K 节课,然后下面每行一个长度为 m 个01字符串,0 表示该人在这一小时没有课,1 表示该人在这一个小时有课,每 ...

  9. 阿里云oss视频上传不能在线播放,js,javascript,在线播放器,插件

    网页视频播放插件 发现阿里云oss储存,上传了视频不能在线播放. 解决方法:使用插件播放即可解决. <html> <head> <meta charset="u ...

  10. 学以致用十七-----shell脚本之比较数字和字符串及if else

    非常需要注意的是shell脚本对空格要求非常严格, 如: 比较字符串   (不能用于比较字符串) 以上这种写法会报错 因此比较字符串不用 单中括号 [ ] -----------------有误 而是 ...