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

报错现象

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

报错时,xml文件

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

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

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

分析问题

但是为什么会多呢

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

  1. public void Save()
  2. {
  3. if (config != null)
  4. {
  5. if (!File.Exists(saveFile))
  6. {
  7. File.Create(saveFile).Close();
  8. }
  9. XmlSerializer serializer = new XmlSerializer(typeof(Configs));
  10. using (FileStream stream = new FileStream(saveFile, FileMode.Open))
  11. {
  12. serializer.Serialize(stream, config);
  13. }
  14. }
  15. }

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

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

解决问题

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

  1. public void Save()
  2. {
  3. if (config != null)
  4. {
  5. if (!File.Exists(saveFile))
  6. {
  7. File.Create(saveFile).Close();
  8. }
  9. XmlSerializer serializer = new XmlSerializer(typeof(Configs));
  10. using (FileStream stream = new FileStream(saveFile, FileMode.Truncate))
  11. {
  12. serializer.Serialize(stream, config);
  13. }
  14. }
  15. }

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. 企业类Web原型制作分享-Kraftwerk

    这是一个设计师团队,将数码产品的创意发挥到极致.整个网站采用深黑色背景和图文搭配,网站有很多动画特效,均突出数码产品的质感.网站结合滚动区实现导航栏悬浮效果,用弹出面板实现点击弹出内容等交互效果. 本 ...

  2. 如何获取堆的dump 的信息,如何分析

    获取方式: 1. jdk 自带启动参数 -XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=/x/x 产生dump日志,然后用visualVm分析 2. jmap 命 ...

  3. JS代码判断浏览器类型以及版本

    browserVersion:function(){ var explorer = window.navigator.userAgent; if (explorer.indexOf("MSI ...

  4. 在ugui上显示3d物体

    1.接下来,使Cube的Layer和背景一样为UI层, 2.在将我们的主相机culling Mask改为UI,如果你还想渲染其他层的物体,可以根据需要该为需要的层,或者直接改为Everyting 3. ...

  5. 2018.12.15 spoj Substrings(后缀自动机)

    传送门 后缀自动机基础题. 求长度为iii的子串出现次数的最大值. 对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案. 然后由于后缀链接将其转化 ...

  6. 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)

    传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...

  7. 将驼峰转化为下化线(将型如AbcDef转化为abc_def)

    strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', 'AbcDef'))

  8. (4)4 larger-than-life lessons from soap operas

    https://www.ted.com/talks/kate_adams_4_larger_than_life_lessons_from_soap_operas/transcript 00:12In ...

  9. identify.class.php<======>token加密方法

    class Identify { static private $cert = "1111111"; static public function writeSecret($mob ...

  10. 4-具体学习git--分支

    图形的方式显示日志:git log --oneline --graph 两种方式建立分支: 1.git branch dev,建立一个dev的分支 git branch 查看分支有哪些,星号在当前分支 ...