1

如果您的集群成员包含一个对象的旧版本(旧库、未更新的对象等),由于库管理不正确,您可能会进入 IMAP 重复条目(从模型对象的角度来看) ...

如果您有 IMAP,例如, IMAP<MyKey, MyValue> 不同版本的MyKeyMyValue可以混合......

  1. 当你对一个旧版本的对象进行 GET 操作时,你会得到一个 HazelcastSerializationException: java.io.InvalidClassException
  2. 当您执行 PUT 时,您不会有任何异常?.....:(

有什么办法可以控制这个?

感谢你!

4

1 回答 1

3

这实际上取决于您如何序列化对象。

  • 如果您依赖于默认的 java 序列化(MyKeyMyValue实现Serializable),那么您需要static final long serialVersionUID在每次修改类时使用和更新它。

  • 如果您使用自定义序列化(例如实现 com.hazelcast.nio.serialization.StreamSerializer),则由您来检测读取和写入的格式变化并采取相应措施。

注意:如果您需要更具体的答案,请提供您的类(MyKeyMyValue)的一些代码、相关地图的 hazelcast conf 以及您的序列化技术。

编辑(评论后):

我将假设您使用in-memory-format地图的默认设置,即BINARY. 在这种情况下,hazelcast 将映射项存储为字节而不反序列化它们,因此put(). 但是,当您get()获得值时,hazelcast 必须对其进行反序列化,这就是您得到异常的时候。

另一方面,如果您设置in-memory-formatOBJECT,hazelcast 将被迫反序列化对象,put()然后您将遇到异常。

编辑2:

还有另一种方法可以在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);
于 2016-08-12T10:58:01.027 回答