首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >判断对象是否被修改的最佳方法是什么?

判断对象是否被修改的最佳方法是什么?
EN

Stack Overflow用户
提问于 2018-09-11 01:45:04
回答 2查看 0关注 0票数 0

我有一个对象作为序列化的base-64字符串映射到cookie。如果对服务器端的cookie中存储的对象进行了更改,我只想写出一个新的cookie。

我想要做的是在从cookie中初始化对象时获取哈希码并将原始哈希码与我将cookie头发送给客户端之前存在的哈希码进行比较,以确保我没有除非进行了更改,否则重新序列化/发送cookie。

我打算覆盖.NET的Object.GetHashCode()方法,但我不确定这是检查对象是否被修改的最佳方法。

有没有其他方法可以检查对象是否被修改,或者我应该覆盖该GetHashCode()方法。

更新我决定接受@ rmbarnes的答案,因为它有一个有趣的解决方案,因为我决定在他的帖子结束时使用他的建议,而不是检查修改。我仍然有兴趣听到任何人可能对我的场景有任何其他解决方案。

EN

回答 2

Stack Overflow用户

发布于 2018-09-11 10:43:42

在对象的构造函数的末尾,您可以将对象序列化为基本的64字符串,就像cookie存储它一样,并将其存储在成员变量中。

如果要检查cookie是否需要重新创建,请重新序列化对象并将此新的base 64字符串与存储在成员变量中的字符串进行比较。如果已更改,请使用新值重置cookie。

注意问题 - 不要在序列化本身中包含存储base 64序列化的成员变量。我假设您的语言使用类似sleep()函数(就像PHP的方式)来序列化自身,所以只需确保该成员不包含在该函数中。

这将始终有效,因为您正在比较您在cookie中保存的确切值,并且不需要覆盖GetHashCode(),这听起来可能会产生令人讨厌的后果。

所有这些说我可能只是放弃测试并且总是重置cookie,与进行更改检查相比,它不会有太大的开销,而且错误的可能性要小得多。

票数 0
EN

Stack Overflow用户

发布于 2018-09-11 11:16:31

GetHashCode()应始终与Equals()同步,并且Equals()不一定能保证检查对象中的所有字段(在某些情况下,您希望不是这种情况)。

此外,GetHashCode()不保证为所有可能的对象状态返回唯一值。可以想象(虽然不太可能)两个对象状态可能导致相同的HashCode(毕竟,它只有一个int值的可能状态; 有关详细信息,请参阅Pigeonhole原理)。

如果您可以确保Equals()检查所有相应的字段,那么您可以克隆该对象以记录其状态,然后使用Equals()针对新状态进行检查以查看其是否已更改。

顺便说一下:你提到序列化给了我一个想法。您可以序列化对象,记录它,然后在检查对象更改时,重复该过程并比较序列化值。这样您就可以检查状态更改,而无需对对象进行任何代码更改。但是,这不是一个很好的解决方案,因为:

  1. 这可能非常低效
  2. 它很容易在对象中进行序列化更改; 你可能会对对象状态的变化产生误报。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档