我有一个对象作为序列化的base-64字符串映射到cookie。如果对服务器端的cookie中存储的对象进行了更改,我只想写出一个新的cookie。
我想要做的是在从cookie中初始化对象时获取哈希码并将原始哈希码与我将cookie头发送给客户端之前存在的哈希码进行比较,以确保我没有除非进行了更改,否则重新序列化/发送cookie。
我打算覆盖.NET的Object.GetHashCode()
方法,但我不确定这是检查对象是否被修改的最佳方法。
有没有其他方法可以检查对象是否被修改,或者我应该覆盖该GetHashCode()
方法。
更新我决定接受@ rmbarnes的答案,因为它有一个有趣的解决方案,因为我决定在他的帖子结束时使用他的建议,而不是检查修改。我仍然有兴趣听到任何人可能对我的场景有任何其他解决方案。
发布于 2018-09-11 10:43:42
在对象的构造函数的末尾,您可以将对象序列化为基本的64字符串,就像cookie存储它一样,并将其存储在成员变量中。
如果要检查cookie是否需要重新创建,请重新序列化对象并将此新的base 64字符串与存储在成员变量中的字符串进行比较。如果已更改,请使用新值重置cookie。
注意问题 - 不要在序列化本身中包含存储base 64序列化的成员变量。我假设您的语言使用类似sleep()函数(就像PHP的方式)来序列化自身,所以只需确保该成员不包含在该函数中。
这将始终有效,因为您正在比较您在cookie中保存的确切值,并且不需要覆盖GetHashCode(),这听起来可能会产生令人讨厌的后果。
所有这些说我可能只是放弃测试并且总是重置cookie,与进行更改检查相比,它不会有太大的开销,而且错误的可能性要小得多。
发布于 2018-09-11 11:16:31
GetHashCode()应始终与Equals()同步,并且Equals()不一定能保证检查对象中的所有字段(在某些情况下,您希望不是这种情况)。
此外,GetHashCode()不保证为所有可能的对象状态返回唯一值。可以想象(虽然不太可能)两个对象状态可能导致相同的HashCode(毕竟,它只有一个int值的可能状态; 有关详细信息,请参阅Pigeonhole原理)。
如果您可以确保Equals()检查所有相应的字段,那么您可以克隆该对象以记录其状态,然后使用Equals()针对新状态进行检查以查看其是否已更改。
顺便说一下:你提到序列化给了我一个想法。您可以序列化对象,记录它,然后在检查对象更改时,重复该过程并比较序列化值。这样您就可以检查状态更改,而无需对对象进行任何代码更改。但是,这不是一个很好的解决方案,因为:
https://stackoverflow.com/questions/-100000751
复制相似问题