簡體   English   中英

通過比較它們的序列化字節數組來比較類的兩個實例是否可靠?

[英]Is it reliable to compare two instances of a class by comparing their serialized byte arrays?

給定一個類的兩個實例,通過首先對它們進行序列化然后比較字節數組(或者可能是數組的哈希值)來比較它們是一種好的和可靠的做法。 這些對象可能具有復雜的層次結構屬性,但序列化應盡可能深入。

相比之下,我指的是確保原始類型的所有屬性具有相等值的過程,復雜類型的屬性具有相等的原始類型屬性等。至於集合屬性,它們應該彼此相等:相等的元素,相同的位置:

{'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"}}

 {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二進制格式化程序。

謝謝。

您要求保證序列化表示將匹配。 這將是非常難以實現的,BinaryFormatter是一個復雜的類。 特別是具有對齊填充的序列化結構可能是潛在的問題。

更簡單的是提供一個不匹配的例子。 System.Decimal具有不同的字節模式,用於0.01M和0.010M之類的值。 它的運算符==()表示它們是相等的,它的序列化字節[]不會。

你必須更准確地定義這里的平等意義。

如果其中一個屬性是集合,則可能存在順序差異(由於特定的添加/刪除序列),這些差異可能對您有意義,也可能不重要。 考慮一個字典,其中相同的元素以不同的順序添加。 沖突可能導致不同的二進制流。

它是可靠的,如果:

  1. 圖中的每個類都標記為[Serializable] 這並不像聽起來那么簡單; 如果你比較完全任意的對象,那么很有可能存在一些你無法控制的非序列化的東西。

  2. 您想知道這兩個實例是否完全相同 請記住, BinaryFormatter基本上是潛入這些對象的內部狀態,所以即使它們看起來由於公共屬性而相同,它們也可能不是。 如果您知道在每個實例中創建圖表的方式完全相同,那么您可能並不關心這一點; 但如果沒有,圖表之間可能存在許多隱藏的差異。

    這一點也是一個比人們首先懷疑的更嚴重的皺紋。 如果您決定使用接口替換類,該怎么辦? 您可能有兩個接口,據您所知,它們完全相同; 他們完成相同的任務並提供相同的數據。 但它們可能是完全不同的實現。 IEquatable在於它獨立於具體類型。

因此,這將工作 ,對病例顯著的數字,但我可能不會認為這是一個很好的做法,至少不會在不知道具體的情況下,它在被使用的所有細節。最起碼,我不會依賴於此作為任何兩個實例的通用比較方法; 它應該僅在您了解所涉及的類的實現細節的特定情況下使用。

當然,有些人可能會說編寫任何依賴於類的實現細節的代碼總是不好的做法。 我對此的看法更加適度,但需要考慮的是 - 依賴類的實現細節可能會導致以后難以維護的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM