序列化后IMap的修改值

Modified Value of IMap After Serialization

我在名为 BookMap 的 class 中定义了一个 IMap,如下所示:

private final IMap<String, OrderBook> orderBooksBySymEx =
    FirmMatchingServer.getHazelcastInstance().getMap("BookMap");

OrderBook 是一个复杂的 Class,具有许多不同的成员类型。其中一些嵌套成员本身包含本机 HashMap 和其他可修改对象。所有自定义嵌套成员都已实现 Externalizable 或 Serializable。

BookMap 上有一个 getter 可以将 OrderBook 检索给调用者。

    public OrderBook getOrderBook(String _key)
    {
       log.info("get: " + toString());
       OrderBook obook = null;
       try
       {
          obook = orderBooksBySymEx.get(_key);
          if (obook == null) {
            obook = new OrderBook();
            orderBooksBySymEx.put(_key, obook);
          }
       }
       catch(Exception e)
       {
           log.error(e, e);
       }

       return obook;            
}

Hazelcast 似乎在 put 操作点序列化了 OrderBook:

orderBooksBySymEx.put(_key, obook);

但是,接收OrderBook 实例的调用者可以自由修改它。 我注意到对 OrderBook 的修改没有反映在存储在 Hazelcast IMap 中的二进制表示中,因此 IMap 上的后续 get() 不包含在 put() 之后发生的任何更新。

有什么方法可以告诉 Hazelcast 重新序列化它的对象层次结构,以便不违反 java 引用语义?

这在 Hazelcast 中是不可能的。与您所描述的最接近的是 User Defined Service ,它可以在修改时将自己代理到集群。但在那种情况下,对象状态存在并由集群保护。