序列化抛出ArgumentException / InvalidCastException:需要调试方法

时间:2011-12-07 22:39:10

标签: c# vb.net serialization asp.net-3.5 dotnetnuke

我们有一个带有混合C#和VB.NET(3.5)项目的Web解决方案(注意:有几个vb.net文件确实有Option Strict Off)。我们的代码在DotNetNuke 4.8中作为模块运行。在某些情况下,我们的应用程序将崩溃的方法:

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的确切属性是问题。堆栈跟踪属性为空,但在Message中,堆栈跟踪缩写为:

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,而没有关于被序列化的实际值或属性名称的任何其他信息。 / p>

问题是:如何发现序列化程序遇到问题的字段和值?

在研究这个问题时会想到一些相关的问题/问题:

  • 如果我查看MSDN的Formatters.Binary部分,我猜想ObjectWriter是Binary的内部(正如评论中所建议的那样,红色)?
  • .NET如何在将Int64转换为String时失败?重新说明:Int64的哪些值可能无法转换为String?但是,正如评论中所指出的:Int64可以很容易地转换为字符串,但是铸造它们是一个不同的问题。
  • Serialize方法未宣布此ArgumentException或可能发生InvalidCastException(在“例外”部分中)。

我尝试在ildasm中调查XYZ和该类中属性的类型,以查看任何异常情况,但找不到任何异常情况。

2 个答案:

答案 0 :(得分:2)

你没有提到堆栈跟踪是什么 - 虽然这可能不相关。

如果它在DotNetNuke代码中,我会将DotNetNuke源加载到您的调试器中,并重新创建异常。你也可以编译(相关版本)DotNetNuke源代码,然后将新编译的dll和.pdb文件放到你的\ bin目录中。

完成设置后,进入Visual Studio - >调试,异常,并在“Thrown”列中的“公共语言运行时异常”旁边放置一个复选框。您也可以尝试“本地运行时检查”。

然后重新创建您的测试。代码应该在抛出异常时中断。当发生这种情况时,您不仅可以检查到达该点的堆栈跟踪,还应该能够确定导致问题的值。

请注意,使用这种方法会遇到很多其他异常 - 有些地方使用try / catch作为处理代码的方式,这些都会显示出来。您只需逐步完成这些示例,直到找到所需的示例。

如果所有其他方法都失败了,我会在其中重新编译一个'try / catch'并记录/破坏有问题的值,但你不应该走得那么远。只是让Visual Studio中断抛出的错误应该足以隔离问题。

答案 1 :(得分:0)

回答我自己的问题,希望这可以帮助任何人在搜索查询后到达此处。

最终答案发现于this SO question。我最终使用了.NET Reflector的试用版(以及随附的Visual Studio 2010插件)来进入mscorlib代码。这允许我检查NameInfo以查找导致InvalidCastException的属性。

简而言之,答案是:使用.NET Reflector(或类似工具)进入mscorlib。


PS。虽然步入mscorlib是我在这个问题中提出的问题的答案,但是一旦我获得足够的信息,仍然存在潜在的问题,可能需要一个全新的SO问题。