如果您的群集成员包含一个对象的旧版本(旧库,未更新的对象等等。),您可能会有一个IMAP重复条目(从一个角度来看)模型对象)由于库的管理不正确......
如果您没有IMAP,例如IMAP<MyKey, MyValue>
,则可能会混合 MyKey , MyValue 的不同版本......
有什么方法可以控制它?
谢谢你!
答案 0 :(得分:3)
这实际上取决于您如何序列化对象。
如果您依赖于默认的java序列化(MyKey
和MyValue
实现Serializable
),那么您需要使用static final long serialVersionUID
并在每次修改时更新它该课程。
如果您正在使用自定义序列化(例如实现com.hazelcast.nio.serialization.StreamSerializer),那么您需要检测读取和写入时的格式更改并采取相应措施。
注意:如果您需要更具体的答案,请提供您的课程代码(MyKey
和MyValue
),相关地图的hazelcast conf以及您的序列化技巧。
编辑(评论后):
我假设您使用地图的默认in-memory-format
,即BINARY
。在这种情况下,hazelcast将地图的项目存储为字节而不对其进行反序列化,因此put()
上没有例外。但是,当你get()
值时,hazelcast必须反序列化它,这就是你得到异常的时候。
另一方面,如果您将in-memory-format
设置为OBJECT
,则会强制使用hazelcast对put()
上的对象进行反序列化,然后您将获得例外。
<强> EDIT2:强>
还有另一种方法可以在put()
上激发异常,而无需更改in-memory-format
。您可以在地图上添加EntryAddedListener
。
hz.getMap(Client.MAP_NAME).addEntryListener(new EntryAddedListener() {
public void entryAdded(EntryEvent event) {
// this will deserialize the new value and throw exception if format doesn't match
event.getValue();
}
}, true);