2011-07-12 40 views
9

在我們的客戶端/服務器應用程序中,我們一直在使用BinaryFormatter進行序列化過程。 由於性能原因,我們正在嘗試遷移到protobuf-net(http://code.google.com/p/protobuf-net/)。如何比較兩個.NET對象圖的差異?

我們的軟件在客戶端和服務器之間傳輸帶有循環的巨大圖形。

現在我正在尋找一種方法來確保使用protobuf序列化和反序列化的數據與通常由BinaryFormatter處理的數據完全相同。

一點一點的比較很簡單: 我使用BinaryFormatter序列化到一個文件。 使用BinaryFormatter重新反序列化此文件。 然後我使用ProtoBuf序列化到一個文件中。 使用該文件中的ProtoBuf反序列化。 再次使用BinaryFormatter對文件進行序列化。

然後,我可以簡單地將該文件與原始文件進行比較。

但是,這兩個文件不是100%相等的。所以現在我需要找到一種方法來追蹤差異。

是否有一些工具可視化BinaryFormatter序列化的數據?還是你知道一些其他幫手,它做了深入的比較,並告訴我差異在哪裏?

使用XMLSerializer並比較兩個XML文件是不可能的,因爲BinaryFormatter能夠序列化多於XMLSerializer的數據 - 即使沒有顯式標記字段。

謝謝 TH

+0

我在這裏有大量的代碼來比較單個對象,但比較整個圖形是非常棘手的。如果我不得不猜測*,我會懷疑是否有微小的日期時間精度差異。 –

+0

嘿馬克。如果文件幾乎相同,我會猜測相同。但是,我缺少大約25%的數據。現在我想知道,例如,實例引用是否被共享,儘管它們不應該(因爲原始引用不指向同一對象),或者我忘記了將某些字段添加到TypeModel。一些工具會很棒,只是將整個對象圖繪製成一個人類可讀的圖形(類似於http://ignatu.co.uk/ViewStateDecoder.aspx)(但是,該算法不適用於我們的巨大圖) – TwinHabit

回答

5

如何使用DataContractSerializer與對象跟蹤啓用(preserveObjectReferences在構造函數)。那應該允許你將它們序列化爲xml(至少是一種排序),你可以在這裏比較差異。

+0

好想法。我會給它一個鏡頭。順便說一句,我剛剛發現一個巨大的差異,這是失敗的參考處理的結果。這裏的問題是我們正在序列化的對象已經是一個List。不過,我沒有在您的API中找到指定爲此頂級對象啓用引用跟蹤的可能性。我只知道可以在會員上啓用它。因此,一種解決方法是爲集合提供一個容器類,並對包含的集合啓用參考跟蹤。但在頂層對象上啓用它會更順暢。這已經是可能的了嗎? – TwinHabit

+0

@TwinHabit不是沒有明顯的改變,恐怕協議緩衝區沒有*列表作爲一個對象的概念*,這導致了一些古怪。它*只*知道項目。基本上,你會得到「父母孩子孩子孩子」的線路上 - 從來沒有「父母孩子孩子孩子孩子」(如果你明白我的意思) –

+0

也許我們可以通過透明地移動自定義列表類型對象的功能來增強庫動態創建容器類?這將解決兩個問題:一個可以輕鬆地攜帶自定義列表字段,並在頂層List對象中激活引用跟蹤。我們現在遇到的問題是,我們將不得不改變客戶端/服務器接口,因爲有些方法只返回列表..但讓我們看看。也許我可以說服他們。 – TwinHabit

5

我們遇到了同樣的問題。我們Json序列化兩個對象(格式化,縮進,新行等),然後使用簡單的文本差異。它會告訴你不僅他們不同,而且確切的區別是什麼。