2008-08-29 65 views
3

我有一個映射到一個cookie作爲序列化的base-64字符串的對象。如果在服務器端存儲在cookie中的對象發生更改,我只想寫出一個新的cookie。告訴對象是否被修改的最好方法是什麼?

我想要做的是獲得一個哈希碼,當從cookie /初始化對象時,並將原始哈希代碼與我發送cookie頭關閉之前存在的哈希代碼進行比較,以確保我除非做出更改,否則不必重新序列化/發送cookie。

我打算重寫.NET的Object.GetHashCode()方法,但我不確定這是檢查對象是否被修改的最佳方法。

是否有任何其他方法可以檢查對象是否被修改,還是應該覆蓋GetHashCode()方法。

更新我決定接受@ rmbarnes的答案,因爲它有一個有趣的解決方案,因爲我決定在他的帖子末尾使用他的建議,而不是檢查修改。不過,我仍然有興趣聽到任何其他解決方案,但任何人都可能會遇到我的情況。

回答

1

的一部分,在對象的構造函數結束時,您可以序列化對象到基地64串就像餅乾並將其存儲,並存儲該在一個成員變量中。

當您想檢查cookie是否需要重新創建時,請重新序列化該對象,並將該新的base 64字符串與存儲在成員變量中的字符串進行比較。如果它已更改,請使用新值重置Cookie。

注意這個問題 - 不要在序列化本身中包含存儲基本64序列化的成員變量。我認爲你的語言使用類似於sleep()函數的東西(是PHP如何操作它)來自我序列化,所以只要確保該成員不包含在該函數中。

這將始終有效,因爲您正在比較您在cookie中保存的確切值,並且不需要重寫GetHashCode(),這聽起來像可能會產生令人討厭的後果。

所有這一切說我可能會放棄測試,並總是重置cookie,與更改檢查相比,它不會有太多的開銷,並且錯誤的可能性要小得多。

2

GetHashCode()應該始終與Equals()同步,並且Equals()不一定能保證檢查對象中所有字段的全部(在某些情況下,您希望它不是案件)。

此外,GetHashCode()不保證爲所有可能的對象狀態返回唯一值。可以想象(儘管不太可能)兩個對象狀態可能導致相同的HashCode(畢竟,它只有一個int值的可能狀態;更多細節請參閱the Pigeonhole Principle)。

如果您可以確保Equals()檢查所有適當的字段,那麼您可以克隆該對象以記錄其狀態,然後使用Equals()對照新狀態檢查它是否已更改。

順便說一句:你提到序列化給了我一個想法。您可以序列化對象,記錄它,然後在檢查對象更改時重複該過程並比較序列化的值。這可以讓你檢查狀態變化,而不必對你的對象做任何代碼修改。然而,這並不是一個很好的解決方案,這是因爲:

  1. 這也可能是非常低效
  2. 這是容易的對象序列化的變化;您可能會在對象狀態變化上產生誤報。
0

我個人會說你的計劃去吧..一個好的散列碼是最好的方法來看看對象是否是「原樣」..你可以看看這些噸散列算法,檢查出了明顯的Wikipedia page上的散列函數,並從那裏去..

重寫GetHashCode並去吧!只要確保ALL的信息元素組成的哈希:)

0

對我來說似乎很奇怪,爲什麼你想在服務器端和客戶端存儲相同的對象 - 特別是如果你在每次旅行中比較它們。

我想,反序列化cookie並將其與服務器端對象進行比較將在性能上等同於僅再次序列化對象。但是,如果你想這樣做,我會比較序列化的服務器端對象和cookie的值,並相應地更新。最壞的情況下,你沒有做過序列化。最好的情況下,你做了一個字符串比較。

另一種反序列化和比較對象的方法有反序列化,比較n個字段,然後序列化的最壞情況。最好的情況是反序列化和比較n個字段。

相關問題