2013-03-07 41 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