【发布时间】:2015-08-28 12:06:37
【问题描述】:
我最近将我机器上的 .NET 框架升级到 .NET 4.6,并注意到从/到文件的二进制(反)序列化对象的时间有很大差异。
例如,我有一个 10MB 的文件,它在我的机器上使用 .NET 4.5.2 在大约 2 秒内被反序列化。升级到 .NET 4.6 后最多需要 50 秒(!) - 实际时间非常随机:有时需要 2 秒,有时需要 50 秒(相同的文件,相同的程序,甚至相同的进程)。
有没有其他人注意到类似的行为并且可能找到了解决此问题的解决方法(或解决方案)?
【问题讨论】:
-
你能用代码证明你的说法吗? “有时某些东西不起作用”的问题可能会被关闭。在提问之前,您在研究方面付出了哪些努力?
-
好吧,我的程序非常复杂(我序列化具有数百个字段的对象),但我会尝试找到一个较小的问题示例。我试图找到与 .NET 4.6 相关的更改(或问题)的任何信息,但到目前为止我还没有找到任何信息(尽管有证据表明 .NET 4.6 的 RyuJIT 中存在一些严重问题,所以序列化问题可能是也有某种相关性)
-
你在(反)序列化类或结构吗?
-
您需要创建一个原型来序列化和反序列化该 10mb 文件,看看是否可以重现缓慢。如果可以,请向 microsoft 提交有关它的连接,因为它可能是一个错误。
-
... 我们在工作中遇到了以下问题:x86 不受影响,但 x64 是。问题是我们并行反序列化了很多类(不是结构)。我们与 Microsoft 取得了联系,他们提出了一些解决方法:(a)将您正在(反)序列化的项目更改为结构,(b)创建序列化代理,将
ISerializationSurrogate实现为 shim 以允许将类序列化为结构。如果我的情况听起来很熟悉,我们来自 Microsoft 的反馈是,这是 4.6 中的一个问题,但可以在 4.6.1 中修复。