2010-02-05 23 views
41

我得到一個BindingFailure上使用XmlSerializer一個行代碼:C#XmlSerializer的BindingFailure

XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject)); 

與顯示名稱CustomXMLSerializeObject.XmlSerializers的組件未能在加載‘LoadFrom’結合在AppDomain的上下文ID爲1.導致失敗的原因是:System.IO.FileNotFoundException:無法加載文件或程序集XMLSerializeObject.XmlSerializers,版本= 1.4.0.0,Culture = neutral,PublicKeyToken = null'或其依賴項之一。該系統找不到指定的文件。

該錯誤非常長,並繼續解釋預綁定狀態信息以及它嘗試查找文件的位置。

我試圖去序化的自定義對象相對簡單 - 只是一堆私有整數和具有公共訪問器的字符串。我有一個私有變量是另一個自定義的可序列化類,但是這個私有變量只有公有訪問器在其中。

尷尬的部分?這隻發生在我反序列化的時候。當我序列化對象時,這行代碼運行良好。它工作正常,對象被反序列化並完美填充。不要真正注意到任何性能損失或長時間加載。

這個警告到底是什麼(不是錯誤或異常,程序運行正常)?爲什麼會發生?如果不簡單地禁用警告,我該如何防止它?

+0

您可以避免讓運行時通過使用SGEN進行預烘焙(而不是最有趣的工具)來實時創建序列化程序集。只是一個想法,但我不知道爲什麼你會得到這個錯誤。 – 2010-02-05 18:41:43

+0

你的項目的根名稱空間是什麼? – SwDevMan81 2010-02-05 19:10:36

+0

是的,名稱空間是不同的。因爲我不想放棄任何東西可以讓我的流氓起訴,讓我們只是說應用程序的名稱空間是「Namespace1」和可序列化的對象是在「Namespace2」。 – 2010-02-05 19:21:44

回答

51

根據Strange XmlSerializer error

這個例外是 XmlSerializer的正常操作的一部分。它預計將會被捕獲,並且 將在框架代碼內處理。 只要忽略它並繼續。如果 在調試期間困擾您,請將 Visual Studio調試器設置爲僅在 處停止,而不是所有 異常。

它可能是基於您選擇監視的異常而導致的。

你能告訴我你的例外是如何設置的:調試 - >例外

如果取消勾選BindingFailure託管調試助手下的「時拋出」複選框異常應消失。或者如果你不想這樣做,你可以繼續,因爲這個例外是由設計

+4

勒嘆息......是的,當它們出於調試目的而被拋出時,我確實發送了它。我想我只是說,異常處理被用作控制替代流程。 – 2010-02-05 20:12:10

+0

是的,當我通過Windbg運行的東西時,我遇到了這個問題,並注意到這個錯誤。它確實應該是一個簡單的修復,但它看起來不像任何人修復它。唯一的解決辦法就是禁用該異常,並且在 – SwDevMan81 2010-02-05 20:16:38

+0

這種糟糕的工作方式下工作,認識到可怕的可怕信息最終沒有任何意義是很耗時的。 – 2013-10-11 13:22:31

4

根據MS VS 2010 Feedback這是它的設計。爲了防止這種異常,並防止運行時執行過程中的速度變慢,您需要生成一個XML Serializer程序集。

我可以找到三種工具:Microsoft SGenXGenPlusMvp.Xml.XGen。截至這篇文章,不幸的是,這些都沒有自2007年以來更新。

0

好吧我找到了解決方案。我絕不會接受關閉例外作爲答案。只是似乎有點錯誤....

似乎正在發生的事情是,在以前的程序集或當前程序集的以前版本中,某些引用是在外部使用的。儘管你的代碼可能早就放棄了這些引用,但是這些名字在某個地方仍然有些神祕,正在被搜索到。

轉到您的AssemblyInfo.cs文件並找到ThemeInfo:

[assembly: ThemeInfo(
ResourceDictionaryLocation.ExternalAssembly, //where theme specific resource dictionaries are located 
//(used if a resource is not found in the page, 
// or application resource dictionaries) 
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))] 

變化的第一個位置爲 '無':

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
//(used if a resource is not found in the page, 
// or application resource dictionaries) 
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))] 

,並保持你的例外開啓!我會將這個答案發布到這個類似性質的各種問題上。

+0

聽起來有希望,但不起作用,我仍然得到System.IO.FileNotFoundException – Grant 2013-11-06 03:02:27

+2

只是好奇。你說BindingFailure消失了,但是你現在正在得到FileNotFoundException?文件(或文件)是否與BindingFailure中缺少的文件相同?如果是這樣的話,我認爲你必須有一個虛假的參照物,這個虛假的參考物仍然潛藏着,或者在你的集會的神祕深淵中還有別的東西隱藏在我們身上,這種情況並不包括在內。 – ouflak 2013-11-06 11:50:45

37

使用下面的方法來構建你的XmlSerializer的實例將解決這個問題:

XmlSerializer s = XmlSerializer.FromTypes(new[] { typeof(CustomXMLSerializeObject) })[0]; 

那麼,你不需要關閉例外handlings。

+0

一個很好的解決方案,但是如果我必須將一個額外類型的數組傳遞給'XmlSerializer'呢?當然,在這裏添加更多的類型只會創建更多的'XmlSerializer's,而不包括額外的類型。 – modiX 2015-08-03 09:59:46

+0

這是爲我工作的唯一解決方案,但我無法理解它。任何人都可以解釋我以這種方式創建XmlSerializer和使用問題中顯示的「新」語法實例化它們之間的區別? – EAmez 2016-03-31 11:33:47

+1

是的,這將工作,但需要付出代價!性能! – al2suarez 2016-08-24 22:05:52