English 中文(简体)
比较一个类别的两个例子是否可靠?
原标题:Is it reliable to compare two instances of a class by comparing their serialized byte arrays?

Given two instances of a class, is it a good and reliable practice to compare them by serializaing them first and then comparing byte arrays (or possibly hashes of arrays). These objects might have complex hierarchical properties 但是 (dàn shì) serialization should go as deep as required.

比较指的是确保原始类型的所有属性具有相等的值,复杂类型的属性具有原始类型的相等属性等等。至于集合属性,它们应该相互相等:具有相等元素,相同位置。

{ a , b , c } != { a , c , b }



 {new Customer{Id=2, Name="abc"}, new Customer {Id=3, Name="def"}} 
    !=
 {new Customer{Id=3, Name="def"}, new Customer {Id=2, Name="abc"}}

但是 (dàn shì)

 {new Customer{Id=2, Name="abc"}, new Customer {Id=3, Name="def"}}
    ==
 {new Customer{Id=2, Name="abc"}, new Customer {Id=3, Name="def"}}

我意思是指标准的.NET二进制格式化程序。

谢谢。

最佳回答

你们要求保证,序列化代表人数将相应。 宾特林托马特人将很难去做,这是一个复杂的类别。 尤其具有协调性的序列结构可能是潜在的问题。

更简单的做法是提供一个不匹配的例子。 System.Decimal 对象的值,如 0.01M 和 0.010M,有不同的 byte 模式。它的 operator==() 会说它们相等,但它的序列化 byte[] 不会。

问题回答

你们必须更明确地界定平等的含义。

如果属性中有一个集合,则可能会因为Add / Remove顺序的不同而出现顺序差异(这可能或者可能不重要),请考虑一个词典,在其中相同的元素以不同的顺序添加。碰撞可能会导致不同的二进制流。

如果它是可靠的:

  1. 这张图中的每个类都标记为 [Serializable] 。这并不像听起来那么简单。如果您正在比较完全任意的对象,则很有可能有一些您无法控制的不可序列化的内容。

  2. 您想知道这两个实例是否完全相同。请注意,BinaryFormatter基本上是潜入这些对象的内部状态,因此即使它们通过公共属性看起来相同,它们可能并不相同。如果您确信图表在每个实例中都以完全相同的方式创建,那么您可能不在乎这一点;但如果不是这样,图表之间可能存在许多隐藏的差异。

    这一点比初看起来更加严重。如果你决定用接口替换掉类,该怎么办?你可能有两个接口,据你所知,它们完全相同,并且实现了同样的任务并提供了相同的数据。但它们可能是完全不同的实现。IEquatable 的好处在于它与具体类型无关。

因此,這將在相當多的情況下有效,但我可能不會認為它是一個好的實踐,至少不在不知道使用情況的所有細節時。至少,我不會依賴這作為任何兩個實例的通用比較方法;它應該僅在知道所涉及的類的實現細節的特定情況下使用。

当然,有些人可能会说编写依赖于类实现细节的任何代码都是一种不良实践。我对此持更为温和的看法,但这是值得考虑的——依赖类的实现细节可能会导致以后难以维护的代码。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签