1

我必须使用外部给定的 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:“无”是无效的 XmlNodeType。

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

现在我有以下问题:

  • 为什么安装 .NET4.5 会改变 .NET4.0 程序的行为?还是不是这样,我错过了什么?(在我安装 VS2012 之前,这工作正常!现在它既不在 VS2010 也不在 VS2012 工作)
  • 删除数据类型声明有什么副作用?
  • 哪些其他数据类型声明也会受到影响?我在生成的代码中有很多这样的声明,不仅是整数(nonNegativeInteger、日期等)。

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

亲切的问候

4

1 回答 1

0

好吧,第一个子弹很简单:

  • 为什么安装 .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 相关的任何代码更改(错误修复、更改的行为和新错误)。

于 2013-05-02T14:40:18.113 回答