无法使用 c# xmlserializer 反序列化以前序列化的 XML
Posted
技术标签:
【中文标题】无法使用 c# xmlserializer 反序列化以前序列化的 XML【英文标题】:Cannot deserialize previously serialized XML with c# xmlserializer 【发布时间】:2013-04-26 19:00:45 【问题描述】:我必须使用外部给定的 xml 结构(巨大的)。 我使用 Visual Studio 的 xsd 工具生成应该使用 xmlserializer 进行(反)序列化的类。 由于我们从 VS2010 切换到 VS2012(但仍然针对 .NET 4.0),我在反序列化 XML 时遇到了问题。我将其分解为以下代码:
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute]
[System.Diagnostics.DebuggerStepThroughAttribute]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[XmlRootAttribute("DecoderParameter", Namespace = "", IsNullable = false)]
public class DecoderParameterType
private string[] decoderUpdatePointsField;
/// <remarks/>
[XmlAttributeAttribute(DataType = "integer")]
public string[] DecoderUpdatePoints
get
return this.decoderUpdatePointsField;
set
this.decoderUpdatePointsField = value;
[TestClass]
public class UnitTest1
#region Public Methods and Operators
[TestMethod]
public void TestMethod1()
var fileName = "c:\\temp\\test.xml";
var deserializer = new XmlSerializer(typeof(DecoderParameterType));
var output = new DecoderParameterType DecoderUpdatePoints = new[] "5", "7", "9" ;
using (var fs = new FileStream(fileName, FileMode.Create))
deserializer.Serialize(fs, output);
using (var sr = new XmlTextReader(fileName))
var myParameter = (DecoderParameterType)deserializer.Deserialize(sr);
#endregion
此代码 sn-p 失败并出现异常:
System.Xml.XmlException: 'None' 是无效的 XmlNodeType。
如果我从 XmlAttributeAttribute 中删除“DataType = integer”,它会起作用。
现在我有以下问题:
为什么安装 .NET4.5 会改变 .NET4.0 程序的行为?还是不是这样,我错过了什么? (在我安装 VS2012 之前,它工作正常!现在它在 VS2010 和 VS2012 中都不工作) 删除数据类型声明有什么副作用? 还有哪些其他数据类型声明也会受到影响?我在生成的代码中有很多这样的声明,不仅仅是整数(nonNegativeInteger、日期等)。更新:只有当变量是数组时才会出现问题。
亲切的问候
【问题讨论】:
我曾经遇到过类似的错误,但问题不在于 .NET 版本。 XML 本身删除了其中一个嵌套项,并且 ReadEndElement() 会过早地读取根结束标记。我会先检查 XML 内容本身的完整性。 我检查了这个; XML 似乎很好。我创建了一个小程序,只是做了上面的事情。如果我在只有 .NET 4.0 的机器上启动它,它就可以工作。如果它有 4.5,它会失败。 我发现了一些类似的东西。通读这个,看看它是否有帮助。 ***.com/questions/14689305/… @Dave:谢谢,这很有帮助;配置条目成功了。 【参考方案1】:嗯,第一个子弹很简单:
为什么安装 .NET4.5 会改变 .NET4.0 程序的行为?
因为 .NET 4.5 是一种 over-the-top 安装,而不是并行安装。当您安装 .NET 4.5 时,正在更改 4.0 程序集。定位 4.0 与 4.5 的行为只是确定 IDE 是否允许您引用 4.5 特定功能。即使以 4.0 为目标,一旦您安装 4.5,您将使用 4.5 实现以及与 4.5 相关的任何代码更改(错误修复、更改的行为和新错误)。
【讨论】:
4.5 下旧代码的行为是否有任何记录/“有意”的变化(即不是错误修复或新错误)?以上是关于无法使用 c# xmlserializer 反序列化以前序列化的 XML的主要内容,如果未能解决你的问题,请参考以下文章
C# Xmlserializer 将列表反序列化为 0 而不是 null
C# XMLSerializer 将错误的类型反序列化为 List
c# XmlSerializer 反序列化器缺少默认命名空间
C#中通过XmlSerializer类反序列化多个同名XML元素