我在名为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引用语义?
答案 0 :(得分:0)
这在Hazelcast中是不可能的。与您描述的最接近的是User Defined Service,它可以在修改时将自身代理到集群。但在这种情况下,对象状态仍然存在并受到集群的保护。