2010-08-18 17 views
9

我有以下代碼:爲什麼我得到序列化錯誤?

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml = @"<ArrayOfUserSetting> 
          <UserSetting> 
           <Value>Proposals</Value> 
           <Name>LastGroup</Name> 
          </UserSetting> 
          <UserSetting> 
           <Value>Visible</Value> 
           <Name>WidgetsVisibility</Name> 
          </UserSetting> 
         </ArrayOfUserSetting>"; 

     List<UserSetting> settings = 
       GetObjFromXmlDocument<List<UserSetting>>(xml); 
    } 

    public static T GetObjFromXmlDocument<T>(string xml) 
    { 
     T customType; 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     XmlDocument xmlDocument = new XmlDocument(); 
     xmlDocument.LoadXml(xml); 
     using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument)) 
     { 
      customType = (T)serializer.Deserialize(xmlNodeReader); 
     } 

     return customType; 
    } 
} 

[Serializable] 
public class UserSetting 
{ 
    public string Value { get; set; } 
    public string Name { get; set; } 
} 

的代碼工作正常,並調用GetObjFromXmlDocument產生一個List集合。但是,執行XmlSerializer serializer = new XmlSerializer(typeof(T));時,mscorlib.dll中的System.IO.FileNotFoundException類型的第一次機會異常。

所以我進入調試/例外,並打開託管調試助手。我在該行以下操作:

與顯示名稱「mscorlib.XmlSerializers」的組件未能在「LoadFrom」結合在AppDomain的上下文ID爲1的故障的原因載入時:系統。 IO.FileNotFoundException:無法加載文件或程序集'mscorlib.XmlSerializers,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其某個依賴項。該系統找不到指定的文件。 文件名: 'mscorlib.XmlSerializers,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089'

有人可以解釋爲什麼發生這種情況?有什麼我可以做的UserSetting類,使問題消失?該應用程序對性能非常敏感,我寧可沒有例外。

回答

10

Microsoft says

XmlSerializer的嘗試加載 預先生成的串行器,以避免 彙編上飛序列化代碼的 。 檢查「將通過 Assembly.Load()調用」找到 檢查,這將是 複製Fusion路徑搜索和 加載器邏輯在XmlSerializer中。

當「預生成序列化程序」無法找到時,它看起來像FileNotFound異常在XmlSerializer中引發和處理,然後會導致生成序列化代碼。

+2

謝謝,這是非常有益的!更重要的是,如果你在調試的時候看到這個,只需點擊F5,你的程序就會繼續運行(它不會崩潰......至少不是這個的b/c)。 – 2012-02-09 00:39:06

2

對於少數Visual Studio項目我都在那裏,這是一個煩惱,我寧願禁用例外歇只是BindingFailureSystem.IO.FileNotFoundException

在Visual Studio:CTL-d,CTL-E爲例外對話框:

1)取消選中下託管調試助理

2)取消選中System.IO.FileNotFoundException BindingFailure下公共語言運行時異常

唉,這是更好的:-)