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

C# 如何比较两个.NET对象图的差异?,c#,.net,serialization,protobuf-net,C#,.net,Serialization,Protobuf Net,在我们的客户机/服务器应用程序中,我们一直在使用BinaryFormatter进行序列化过程。 出于性能原因,我们正在尝试迁移到protobuf net() 我们的软件在客户端和服务器之间传输带有周期的巨大图形 现在我正在寻找一种方法来确保使用protobuf序列化和反序列化的数据与通常由BinaryFormatter处理的数据完全相同 逐位比较很简单: 我使用BinaryFormatter将其序列化为一个文件。 使用BinaryFormatter再次反序列化此文件。 然后我使用ProtoBuf

在我们的客户机/服务器应用程序中,我们一直在使用BinaryFormatter进行序列化过程。 出于性能原因,我们正在尝试迁移到protobuf net()

我们的软件在客户端和服务器之间传输带有周期的巨大图形

现在我正在寻找一种方法来确保使用protobuf序列化和反序列化的数据与通常由BinaryFormatter处理的数据完全相同

逐位比较很简单: 我使用BinaryFormatter将其序列化为一个文件。 使用BinaryFormatter再次反序列化此文件。 然后我使用ProtoBuf将其序列化到一个文件中。 使用ProtoBuf从该文件反序列化。 使用BinaryFormatter再次序列化到文件中

然后我可以简单地将该文件与原始文件进行比较

但是,这两个文件并非100%相等。所以现在我需要找到一种方法来追踪差异

是否有某种工具可以可视化由BinaryFormatter序列化的数据?或者你认识其他的助手吗?他会做一个深入的比较,告诉我区别在哪里

使用XMLSerializer并比较两个XML文件是不可能的,因为BinaryFormatter能够序列化比XMLSerializer多得多的数据,即使没有显式标记字段也是如此

谢谢,,
TH

如何使用启用了对象跟踪的
DataContractSerializer
在构造函数中保留ObjectReferences
)。这应该允许您将它们序列化为xml(至少是某种类型的),您可以在其中比较差异。

我们也遇到了同样的问题。我们对两个对象进行Json序列化(使用格式、缩进、新行等),然后使用简单的文本差异。它不仅会告诉您它们是不同的,而且会告诉您它们的区别到底是什么。

我这里有大量代码用于比较单个对象,但比较整个图形是。。。棘手的如果让我猜的话,我想知道是否有微小的日期时间精度差异。嘿,马克。如果这些文件几乎是一样的,我猜也是一样的。然而,我缺少大约25%的数据。现在我想知道,例如,实例引用是否共享了,尽管它们不应该共享(因为原始引用没有指向同一个对象),或者我只是忘记了向TypeModel添加某些字段。有些工具将整个对象图简单地绘制成一个人类可读的图(类似于所做的(但是该算法不适用于我们的大型图))这是个好主意。我要试一试。顺便说一句,我刚刚发现了一个巨大的差异,这是引用处理失败的结果。这里的问题是,我们序列化的对象已经是一个列表。但是,我在您的API中没有发现为这个顶级对象启用引用跟踪的可能性。我只知道在会员身上启用它是可能的。因此,一种解决方法是为集合提供一个容器类,并对包含的集合启用引用跟踪。但是在顶级对象上启用它会更平滑。这已经是可能的了吗?@TwinHabity恐怕不是没有重大变化的——协议缓冲区绝对没有列表作为对象的概念,这导致了一些奇怪的现象。它只知道物品。基本上,在连线上你会得到“父-子”-而不是“父-列表-子”(如果你明白我的意思的话)也许我们可以通过一个功能来增强库,该功能可以透明地将自定义列表类型的对象移动到动态创建的容器类?这将解决两个问题:一个可以轻松携带带有自定义列表的字段,以及在顶级列表对象中激活引用跟踪。我们现在遇到的问题是,我们必须更改客户机/服务器接口,因为有些方法只返回列表。。但让我们看看。也许我能说服他们。