2013-05-02 120 views
1

我必須使用外部給出的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://stackoverflow.com/questions/14689305/serialization-breaks-in-net-4-5 – Dave 2013-05-02 16:27:57

回答

0

嗯,第一發子彈是最簡單的一個:

  • 爲什麼安裝.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