2011-12-07 49 views
1

我們有混合的C#和VB.NET(3.5)項目網絡解決方案(注:一些vb.net文件確實有選項嚴格關閉)。我們的代碼作爲DotNetNuke 4.8中的模塊運行。在某些情況下,我們的應用程序會崩潰的方法:序列化投擲的ArgumentException/InvalidCastException的:調試方法需要

System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString 

在例外的縮短的消息是:

System.ArgumentException: "Error serializing value XYZ of type XYZ." 
System.InvalidCastException: "Unable to cast object of type 'System.Int64' 
to 'System.String'" 
在堆棧跟蹤

無處是我們的代碼,它是最終只是系統代碼未能從我們的代碼序列化類型XYZ。這意味着我不能打破一個斷點並調試XYZ的哪個確切屬性是問題。堆棧跟蹤屬性爲空,但在消息簡稱爲堆棧跟蹤:

DotNetNuke.Services.Exceptions.PageLoadException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.ArgumentException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.InvalidCastException: "Unable to cast object of type 'System.Int64' to type 'System.String'. " 
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject) 
// ...... etc......... 
at System.Web.UI.Page.SaveAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
// --- End of inner exception stack trace 

在此跟蹤的所有相關線路開始System.。頂行是DotNetNuke。但是,在第一個答案的建議之後,我自己編譯了DotNetNuke(4.8)代碼,結果發現代碼只是Server.GetLastError,顯示InvalidCastException爲InnerException,沒有任何有關正在序列化的實際值或屬性名稱的附加信息。

接下來的問題是:我該如何發現串行器遇到麻煩的字段和值?

一些相關的問題/來考慮問題,而研究這個問題:

  • 如果我看MSDN的Formatters.Binary部分我猜的ObjectWriter是內部二進制(如意見提出,紅色)?
  • .NET甚至可以在將Int64轉換爲String時失敗?重述:Int64的值可能不會轉換爲字符串?但是,正如評論中所指出的那樣:Int64可以很容易地轉換爲字符串,但鑄造它們是一個不同的問題。
  • Serialize方法不宣佈這一ArgumentException的或可能會出現InvalidCastException的(在例外部分)。

我試圖調查XYZ和ildasm該類中的屬性類型,以查看任何違規行爲但找不到任何。

+1

'(字符串)42L'引發InvalidCastException,也是如此任何其他Int64值。 Int64值不能被轉換爲'string'。 (儘管你可以使用'Convert.ToString(42L)'或'42L.ToString()'將它轉換爲'string'。) – dtb

+1

ObjectWriter是'System.Runtime'中的'internal'類。 Serialization.Formatters.Binary'命名空間。 – dtb

+0

嗯謝謝你的有用評論!說得通。想想我會更新這部分的問題。 – Jeroen

回答

0

回答我的問題,希望這將幫助任何人搜索查詢後,結束了這裏。

最終的答案在this SO question找到。我最終使用了.NET Reflector的試用版(以及包含的Visual Studio 2010插件)來進入mscorlib代碼。這使我可以檢查NameInfo是否導致InvalidCastException的屬性。

總之,回答是:使用.NET反射器(或類似的工具)踏入mscorlib程序。


PS。雖然進入mscorlib是我在這個問題中提出的問題的答案,但仍然存在一個潛在的問題,可能需要一個全新的SO問題,一旦我獲得足夠的信息。

+0

如果它在DNN框架中,請不要忘記將它登錄到Gemini中,即使答案是更好地捕捉並報告無效演員。 –

+0

我會,但最終我不認爲DNN與它有任何關係,除非注意到'Server.GetLastError'的問題。如果我確實發現了這個問題,我會盡力的。感謝這個問題中的所有提示和反饋:D – Jeroen

2

你沒有提什麼堆棧跟蹤是 - 儘管這可能是不相關的。

如果它在DotNetNuke的代碼,我想了加載DotNetNuke的源到你的調試器,並重新創建例外。你也可以不用編譯(相關版本)的DotNetNuke源代碼,而只是將新編譯的dll和.pdb文件放到你的\ bin目錄下。

一旦你得到了建立,進入Visual Studio中 - >調試,異常,並把旁邊的複選框「通用語言運行時例外」中的「時拋出」列。您也可以嘗試'Native Run-Time檢查'。

然後重新創建您的測試。代碼在拋出異常時應該中斷。發生這種情況時,您不僅可以檢查堆棧軌跡,瞭解如何達到該點,您應該能夠確定導致問題的值。

注意,使用這種方法,你會遇到很多其他異常的 - 有些地方的try/catch被用作處理代碼的方式,而這些都將顯示出來。你只需通過這些例子,直到你找到你需要的。

如果一切都失敗我會與違規值「的try/catch」在它和登錄/斷線重新編譯,但你不應該需要去那麼遠。只要讓Visual Studio中斷拋出的錯誤就足以隔離問題。

+0

感謝您的建議。當我有空時,我肯定會放棄這一點並更新問答和/或接受答案。 – Jeroen

+0

我還會用堆棧跟蹤信息更新問題。 – Jeroen

+0

這是一個很好的建議,但不幸的是我的問題的答案。當我點擊DotNetNuke中的斷點時,事實證明它只是處理'Server.GetLastError',此時InnerException('InvalidCastException')不會提供有關實際值(或屬性)序列化失敗的任何信息。 – Jeroen