无法反序列化以前序列化的XML与c#xmlserializer

问题描述:

我必须使用外部给出的xml结构(巨大)。 我使用Visual Studio的xsd工具生成应该使用xmlserializer序列化的类。 由于我们从VS2010切换到VS2012(但仍以.NET 4.0为目标),所以在反序列化XML时遇到了问题。我打破了下来,下面的代码:无法反序列化以前序列化的XML与c#xmlserializer

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 
} 

这段代码失败,出现异常:

System.Xml.XmlException: '无' 是无效的XmlNodeType。

它工作,如果我从XmlAttributeAttribute中删除“DataType =整数”。

现在我有以下问题:

  • 为什么安装.NET4.5改变.NET4.0的行为 - 程序?或者情况并非如此,我错过了什么? (在我安装VS2012之前,这工作得很好!现在它既不在VS2010中,也不在VS2012中工作)
  • 删除数据类型声明有哪些副作用?
  • 哪些其他数据类型声明也受到影响?我在生成的代码中有很多这些声明,不仅是整数(nonNegativeInteger,date等等)。

更新:只有当变量是数组时才会出现问题。

亲切的问候

+1

我曾经有一次类似的错误,但问题不是.NET版本。 XML本身已经删除了其中一个嵌套项目,并且ReadEndElement()会过早地读取根结束标记。我首先会检查XML内容本身的完整性。 – OnoSendai 2013-05-02 14:44:40

+0

我检查了这一点; XML似乎很好。我创建了一个小程序,只是做了上面的。如果我在只有.NET 4.0的机器上启动它,它就可以工作。如果它有4.5,则失败。 – Maroni 2013-05-02 16:09:19

+0

我发现了一些看起来很相似的东西。通读这一点,看看它是否有帮助。 http://*.com/questions/14689305/serialization-breaks-in-net-4-5 – Dave 2013-05-02 16:27:57

嗯,第一发子弹是最简单的一个:

  • 为什么安装.NET4.5改变.NET4.0的行为 - 程序?

因为.NET 4.5是一个超级安装,而不是并行安装。当你安装.NET 4.5时你是改变了4.0程序集。定位4.0 vs 4.5的行为只是决定IDE是否会让您参考4.5 特定的功能。即使瞄准4.0,一旦你安装了4.5,你正在使用4.5实现以及与4.5相关的任何代码修改(错误修正,改变的行为和新的错误)。

+0

旧代码在4.5以下的行为是否有任何记录/“故意”的变化(即不是错误修复或新错误)? – 2013-05-02 17:42:59