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

无法使用c#xmlserializer反序列化以前序列化的XML,c#,xml,xmlserializer,xsd.exe,C#,Xml,Xmlserializer,Xsd.exe,我必须使用外部给定的xml结构(巨大)。 我使用VisualStudio的xsd工具生成应该使用xmlserializer(反)序列化的类。 由于我们从VS2010切换到VS2012(但仍以.NET4.0为目标),我在反序列化XML时遇到了问题。我将其分解为以下代码: using System.IO; using System.Xml; using System.Xml.Serialization; using Microsoft.VisualStudio.TestTools.UnitTest

我必须使用外部给定的xml结构(巨大)。 我使用VisualStudio的xsd工具生成应该使用xmlserializer(反)序列化的类。 由于我们从VS2010切换到VS2012(但仍以.NET4.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
}
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
/// 
[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”,“4.0.30319.1”)]
[System.SerializableAttribute]
[System.Diagnostics.DebuggerStepThroughAttribute]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[XmlRootAttribute(“DecoderParameter”,Namespace=“”,IsNullable=false)]
公共类DecoderParameterType
{
私有字符串[]decoderUpdatePoints字段;
/// 
[XmlAttributeAttribute(DataType=“integer”)]
公共字符串[]DecoderUpdatePoints
{
得到
{
返回此.decoderUpdatePoints字段;
}
设置
{
this.decodeRupdatePoints字段=值;
}
}
}
[测试类]
公共类UnitTest1
{
#区域公共方法和运算符
[测试方法]
公共void TestMethod1()
{
var fileName=“c:\\temp\\test.xml”;
var反序列化器=新的XmlSerializer(typeof(DecoderParameterType));
var output=new DecoderParameterType{DecoderUpdatePoints=new[]{“5”、“7”、“9”};
使用(var fs=newfilestream(文件名,FileMode.Create))
{
序列化(fs,输出);
}
使用(var sr=newXMLTextReader(文件名))
{
var myParameter=(DecoderParameterType)反序列化程序。反序列化(sr);
}
}
#端区
}
此代码段失败,出现异常:

System.Xml.XmlException:“无”是无效的XmlNodeType

如果我从XmlAttributeAttribute中删除“DataType=integer”,它就会工作

现在我有以下问题:

  • 为什么安装.NET4.5会改变.NET4.0程序的行为?还是不是这样,我错过了什么?(在我安装VS2012之前,它工作得很好!现在它既不在VS2010中也不在VS2012中工作)
  • 删除数据类型声明有什么副作用
  • 哪些其他数据类型声明也受到影响?我在生成的代码中有很多这样的声明,不仅仅是整数(非负整数、日期等)
更新:仅当变量是数组时才会出现问题


好心的问候

好吧,第一个子弹是简单的:

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

因为.NET4.5是一个顶级安装,而不是并行安装。安装.NET 4.5时,您正在更改4.0程序集。以4.0和4.5为目标的行为只是决定IDE是否允许您参考4.5特定的功能。即使是针对4.0,安装4.5后,您也会使用4.5实现,并对与4.5相关的任何代码进行更改(错误修复、行为更改和新错误)。

我曾经遇到过类似的错误,但问题不在.NET版本。XML本身删除了其中一个嵌套项,ReadEndElement()会过早读取根结束标记。我首先检查XML内容本身的完整性;XML似乎很好。我创建了一个小程序,就是这样做的。如果我在一台只有.NET4.0的机器上启动它,它就会工作。如果它有4.5,它就失败了。我发现了一些类似的东西。通读这篇文章,看看是否有帮助@戴夫:谢谢,这很有帮助;Configurationon条目起到了作用。4.5下的旧代码的行为是否有任何记录在案的/有意的改变(即不是错误修复或新的错误)?