如何比较两个.NET对象图的差异?

12
在我们的客户端/服务器应用程序中,我们一直在使用BinaryFormatter进行序列化过程。出于性能原因,我们试图迁移到protobuf-net (http://code.google.com/p/protobuf-net/)。
我们的软件在客户端和服务器之间传输大型带有循环的图形。
现在我正在寻找一种方法来确保使用protobuf进行序列化和反序列化的数据与通常由BinaryFormatter处理的数据完全相同。
一比特比较很简单: 我使用BinaryFormatter将其序列化到文件中。 再次使用BinaryFormatter从该文件进行反序列化。 然后我使用ProtoBuf将其序列化到文件中。 使用ProtoBuf从该文件进行反序列化。 再次使用BinaryFormatter将其序列化到文件中。
然后我可以将该文件与原始文件进行比较。
但是,这两个文件并不完全相等。所以现在我需要找到一种方法来跟踪差异。
也许有一些工具可以可视化由BinaryFormatter序列化的数据吗?或者您是否知道其他助手可以进行深入比较并告诉我差异在哪里?
使用XMLSerializer并比较两个XML文件是不可能的,因为BinaryFormatter能够序列化更多的数据而无需明确标记字段。
谢谢, TH

我在SO上有很多比较单个对象的代码,但是比较整个图形是有点棘手的。如果我不得不猜测,我会想知道是否存在微小的日期时间精度差异。 - Marc Gravell
嘿,马克。如果文件几乎相同,我会猜测是一样的。然而,我缺少大约25%的数据。现在我想知道,例如,实例引用是否被共享,尽管它们不应该被共享(因为原始引用没有指向相同的对象),或者我只是忘记将某些字段添加到TypeModel中。一个工具会很棒,可以将整个对象图绘制成人类可读的图形(类似于http://ignatu.co.uk/ViewStateDecoder.aspx所做的那样(但是该算法无法处理我们的巨大图形))。 - TwinHabit
2个回答

6

使用启用对象跟踪的DataContractSerializer如何?在构造函数中设置preserveObjectReferences。这样做应该允许您将它们序列化为xml格式(至少是某种形式),从而可以比较差异。


好主意。我会试一下。顺便说一下,我刚发现一个巨大的区别,这是引用处理失败的结果。问题在于我们正在序列化的对象已经是一个列表。然而,在您的API中,我没有找到指定应为此顶级对象启用引用跟踪的可能性。我只知道可以在成员上启用它。因此,一个解决方法是为集合提供一个容器类,并在包含的集合上启用引用跟踪。但在顶级对象上启用它会更加顺畅。那已经可以了吗? - TwinHabit
@TwinHabit,恐怕不行,需要进行重大更改——协议缓冲区完全没有“列表作为对象”的概念,这导致了许多奇怪的问题。它只知道项目。基本上,在线上你会得到“父子子子子”-从来没有“父列表子子子子”(如果你明白我的意思)。 - Marc Gravell
也许我们可以通过一个特性增强库,该特性能够将自定义列表类型的对象透明地移动到动态创建的容器类中?那将解决两个问题:可以轻松携带具有自定义列表的字段,并在顶层列表对象中激活引用跟踪。我们现在遇到的问题是,我们必须更改客户端/服务器接口,因为某些方法仅返回列表。但是让我们看看。也许我可以说服他们。 - TwinHabit

5

我们曾经遇到过同样的问题。我们使用Json序列化这两个对象(包括格式、缩进、换行等),然后使用简单的文本差异比较工具。它不仅能告诉你它们的不同之处,还能精确地指出差异所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接