序列化后IMap的修改值

时间:2018-05-17 17:49:22

标签: java hazelcast hazelcast-imap

我在名为BookMap的类中定义了一个IMap:

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

OrderBook是一个复杂的类,有许多不同的成员类型。其中一些嵌套成员本身包含本机HashMaps和其他可修改对象。所有自定义嵌套成员都实现了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引用语义?

1 个答案:

答案 0 :(得分:0)

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