.net - 如何调试(步入)BinaryFormatter.Deserialize()?

标签 .net visual-studio debugging debug-symbols

我的应用程序尝试反序列化客户端发送的数据,但失败并出现以下错误:

Exception thrown: 'System.Runtime.Serialization.SerializationException' in mscorlib.dll

Additional information: Cannot get the member '<.ctor>b__0'.



谷歌搜索没有结果。好的,我决定进入反序列化逻辑并尝试找出究竟是什么导致了这种情况。好吧,一天过去了,我还差得远呢。

我使用了来自 Microsoft Reference Source 的指令网站来配置 Visual Studio。它确实下载了一些东西
MicrosoftPublicSymbols\mscorlib.pdb\
   DCF1E4D31F6944AC87E7A634262BEE881\mscorlib.pdb (780kb)
   E47257B512BA49BC9FC367C532FC5F1E2\mscorlib.pdb (953kb)

但调试器不会介入。

我用谷歌搜索了更多,找到了另一种方法 - 安装了 dotTrace 应用程序和 used it as source server .这也无济于事。我仍然看到以下内容:

enter image description here
Symbol Load Information mscorlib.pdb 的弹出窗口说

C:\Users\me\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols\mscorlib.pdb\e47257b512ba49bc9fc367c532fc5f1e2\mscorlib.pdb: Symbols loaded.



我可以进入 System.Windows.Forms、System.Linq 等 - 所以一般来说,它可以工作 - 它只是对 BinaryFormatter.Deserialize() 的特殊调用不起作用。这可能是什么原因,我怎样才能让它介入?

会不会是因为SecuritySafeCritical属性?
[System.Security.SecuritySafeCritical] 
public Object Deserialize(Stream serializationStream)

我正在使用 VS 2015 .Net 4.5.2(尽管我尝试了 4.5 并获得了相同的结果)。

最佳答案

如果没有任何细节,我可以假设这是您尝试序列化和反序列化的对象版本的兼容性问题。看起来客户端向您发送了一些旧对象位(构造函数中没有 lambda)。并且您的服务器正在运行更新版本的软件,以搜索某些 lambda 方法。

<.ctor>b__0 - 是 .ctor(对象构造函数)中第一个 lambda 方法的方法名称。

因此,例如,如果您在客户端的机器对象 A 上:

class A {
  public A() {
   int a = 5;
   int b = 7;
   // Plain code, no lambdas
  }
}

然后你在服务器上更新了你的类,在构造函数中引入了 lambda:
class A {
  public A() {
   int a = 5;
   int b = 7;
   Func<int,int> some = x => x * 2 + a; 
  }
}

之后它们的二进制表示不一样,服务器版本的 A 有私有(private)的不可见方法 <.ctor>b__0 在里面。

Generated IL for lamda method in class A1

关于.net - 如何调试(步入)BinaryFormatter.Deserialize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33419067/

相关文章:

database - Visual Studio/IIS改变Access文件表数据的顺序

c# - 使用 R.net 的独立可执行文件

java - 获取异常 java.util.NoSuchElementException : No line found while reading from file?

c# - 如何安全地将数据库值分配给对象属性?

c++ - 在 crypto++ 中将字符串转换为字节

.net - Azure 构建/发布管道将库推送到 nuget

javascript - 尝试使用 Eclipse 的 Chrome 调试器调试 NodeJ 时“无法获取调试选项卡”

android - 调试 Android native C++ : activate breakpoint

c# - 如何防止表单关闭时控件中的事件触发

c# - .NET XAdES 签名抛出 CryptographicException