我在一个对象上有一个 Equals 覆盖,以检查使用预编译的 protobuf-net 序列化器对象反序列化的两个对象之间的值相等性。我已经验证了反序列化按预期发生(在那张纸条上,protobuf-net 很棒)。
这个类非常简单,但是其他更复杂的类也会出现类似的问题,所以我将使用它作为模型。
这是有问题的代码片段:
public bool Equals (CompressionConfiguration other) {
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals (AlgorithmName, other.AlgorithmName) &&
(AlgorithmConfiguration == null ? other.AlgorithmConfiguration == null :
AlgorithmConfiguration.SequenceEqual(other.AlgorithmConfiguration));
}
在 .NET 运行时执行时,这会按预期进行计算,允许 AlgorithmConfiguration 为空值,它是 byte[] 类型的。在 Mono 下,我得到一个 SequenceEqual 空参数错误,特别是 ArgumentNullException。是什么赋予了?这不应该发生,因为只有在 AlgorithmConfiguration != null 时才应该调用 SequenceEqual。
这绝对是源头,因为如果我为 CompressionConfiguration 提供零长度字节 [],则不会发生故障。如果可能的话,我真的宁愿不发送零长度数组。我必须具有 Mono 兼容性,因为这将用于 Xamarin.Android (MonoDroid) 和 MonoTouch,以及 Mono 服务器,然后是 .NET 桌面应用程序。