序列化后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 ,它可以在修改时将自己代理到集群。但在那种情况下,对象状态存在并由集群保护。
我在名为 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 ,它可以在修改时将自己代理到集群。但在那种情况下,对象状态存在并由集群保护。