不能用c# xmlserializer反序列化先前序列化的XML

本文关键字:前序 序列化 XML 反序列化 xmlserializer 不能 | 更新日期: 2023-09-27 18:11:55

我必须使用外部给定的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
}

下面的代码段出现了一个异常:

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

如果我从XmlAttributeAttribute中删除"DataType = integer",它就会起作用。

现在我有以下问题:

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

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

亲切的问候

不能用c# xmlserializer反序列化先前序列化的XML

第一项比较简单:

    为什么安装。net4.5会改变。net4.0程序的行为?

因为。net 4.5是over- top安装,而不是并排安装。当您安装。net 4.5时,您正在更改4.0程序集。针对4.0和4.5的行为仅仅决定了IDE是否允许您引用4.5 特定的特性。即使您的目标是4.0,一旦您安装了4.5,您将使用4.5实现以及与4.5相关的任何代码更改(错误修复、更改的行为和新错误)。