【问题标题】:Should this bug be fixed?这个错误应该修复吗?
【发布时间】:2009-11-07 11:20:13
【问题描述】:

我昨天在 .Net 框架中发现了一个错误,发现这是一个无法修复的已知错误。简而言之,错误是包含类型为 IComparable 的字段的类在将 int(可能还有其他二进制类型)分配给该字段时不能进行二进制序列化和反序列化:

[Serializable]
public class Foo
{
    public IComparable Value;
}

如果您尝试序列化(和反序列化)以下两个对象,第一个将成功,第二个将失败:

var s = new Foo { Value = "foo" };
var i = new Foo { Value = 1 };

我在这里更详细地描述了这一点:http://ondevelopment.blogspot.com/2009/11/fix-that-bug-will-ya-no.html

您可以在此处找到错误报告(请注意,此报告是 2006 年的,不是我提交的):http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=91177

这不会被修复,因为“修复的风险超过了它的好处”。我没有看到任何(可行的)场景,这将是一个突破性的变化。所以我的实际问题是,谁能想到一个真正的场景,这将是一个突破性的变化?

【问题讨论】:

  • 它与 Mono/gmcs 2.0.1 一起正常工作。
  • @Thomas,这很有趣。实际上,这可能会作为一个错误提交给 Mono 团队,因为据我所知,他们试图反映 BCL 中的错误。
  • 微软从来没有对他们的任何系统进行过大的改变,这可能会破坏任何依赖旧东西的预先存在的软件(你好,操作系统膨胀!)。我相信你实际上必须先以某种方式改变整个公司才能解决这个问题。
  • Mono 为 BCL 类提供了完全不同的实现,因此一般来说,Microsoft .NET 问题可能不会影响 Mono。
  • @lextm-MSFT 我知道 Mono 是 BCL 的完全不同的实现,但我也知道它们反映了 BCL 中的已知错误。不记得有什么具体的例子了,但我知道 Miguel 不止一次谈到过这个问题。

标签: .net serialization


【解决方案1】:

我敢打赌,对于像 int 这样的原生类型用于序列化甚至系统的其他部分,他们已经做了一些非常人为的优化。

撤消该操作可能会带来风险,因为它可能会导致正确性或性能下降,或两者兼而有之。

【讨论】:

    【解决方案2】:

    我没有看到任何(可行的)可能会造成重大变化的场景

    我认为不会有任何故意的重大更改,但修复可能导致回归的错误还涉及其他风险。

    您的示例看起来很做作,因此我认为他们得出的结论是风险大于收益。如果这确实给您带来了问题,他们还让您有机会联系 PSS。

    【讨论】:

    • 不是我提交了这个错误,正如你看到的错误报告已经有四年了。这对我来说不是什么大问题,我只对错误修复可能导致的问题感兴趣。我绝不是在暗示他们错了,我只是说我无法想出一个突破性变化的场景,我很想看看其他人是否可以。
    • “我无法想出一个突破性变化的场景” - 序列化的内部实现方式很复杂,你不需要想出一个场景来理解这一点更改复杂代码是有风险的。
    • 我的例子是如何设计的?问题中的示例是一个简单的错误重现,请查看博客文章以获取对实际问题的更多详细描述。你的意思是他们害怕解决这个问题,因为它可能会破坏一些完全不相关的东西?如果不检查二进制序列化实现的来源,我无法告诉你我是否认为这可能。但对我来说,这似乎是人为的。
    • 您可以联系 PSS 以查看是否可以更改您的代码中的任何内容以解决此问题。只是不要指望 PSS 可以为您解决问题。
    • @lextm-MSFT 如果您阅读了我的博客文章,我会提供一种解决方法。这个问题与此无关,它是关于 - 出于好奇 - 找到一个解决此错误会破坏其他工作代码的场景示例。
    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2020-06-17
    • 2020-09-30
    相关资源
    最近更新 更多