2013-03-07 13 views
1

我有一个对象的Equals重写,用于检查使用预编译的protobuf-net serialiser对象反序列化的两个对象之间的值相等。我已经验证了反序列化按预期发生(在该笔记上,protobuf-net很棒)。Mono vs .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空值,这是字节[]型。在Mono下,我得到一个SequenceEqual null参数错误,特别是一个ArgumentNullException。是什么赋予了?这不应该发生,因为只有在AlgorithmConfiguration!= null时才应该调用SequenceEqual。

这绝对是源,因为如果我为CompressionConfiguration提供零长度字节[],则不会发生故障。如果可能,我真的不想发送零长度的数组。 我必须具有单声道兼容性,因为这是用于Xamarin.Android(MonoDroid)和MonoTouch,以及单声道服务器,然后是.NET桌面应用程序。

+0

它看起来像AlgorithmConfiguration不为null等.AlgorithmConfiguration为空。这将通过你所有的支票。 – 2013-03-07 23:44:24

+0

它是相同的对象 - 并且AlgorithmConfiguration肯定是null。这是一个好点,谢谢!我将添加该案例。 另外,我只是重新编译了serialiser,现在它完美地工作。我感到困惑。我没有改变任何东西......无论如何,它现在有效。也许预编译的serializer必须重新编译为使用Mono编译器在Mono下使用 - 我认为它使用的是我的Windows机器上编译的dll。它反过来了! – zenith 2013-03-07 23:48:07

+0

如果它是同一个对象,那么这个“这个”检查就会发现它 – 2013-03-09 10:16:50

回答

0

奇怪的是,在Mono下重新编译serialiser程序集可以解决问题,即使这不是ArgumentNullException的原点,并且我已验证对象已正确反序列化。现在一切正常。

+0

这只是...奇怪!当你说“重新编译serialiser程序集”时......具体是哪个程序集?有什么我可以做的repro这个? – 2013-03-08 07:50:32

+0

我有一个解决方案,我们将称之为MySolution。我有一个使用名称空间MyProject.DTO的项目,其中包含所有可序列化的数据对象。我使用protobuf-net的precompile.exe来生成MySolution.DTOSerialiser类型的序列化程序集。 DTOSerialiser是我重新编译的一个。我没有重新编译MySolution.DTO项目或MySolution.Tests。所有测试都可以在Windows下运行,但在Mono下不能在OS X下运行。 – zenith 2013-03-09 09:07:08