Hazelcast为客户端和地图存储进行不同的(反)序列化

时间:2018-07-05 21:10:52

标签: caching serialization deserialization hazelcast

我在以下上下文中运行hazelcast成员和客户端:

Hazelcast clients, members with persistence 如上图所示:

  1. 我希望客户控制序列化(反序列化),并让新客户加入,而不要让hazelcast成员参与序列化业务。
  2. 希望基于命名约定(例如,所有具有“ * Store”匹配模式的地图都需要保留到cassandra db中。
  3. 由于我选择以二进制格式保存,因此我希望将hazelcast中存储的相同byte []提供给mapstore接口。

我的问题是-hazelcast似乎在调用mapstore .store()方法之前应用了反序列化器,并在服务器端查找了具有原始存储的typeId的序列化器类。合理的解决方案是,如果我的地图存储类型为byte [],则hazelcast不对地图存储应用反序列化器,或者让我定义反序列化器,无论typeId如何,该解串器都可以使用。看起来两者似乎都不可能。

任何解决问题的想法都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

默认情况下(内存格式设置为BINARY)仅在客户端进行序列化和反序列化。但是,您使用的MapStore要求Hazelcast向 MapStore.store 方法提供实际的输入对象,从而在服务器上进行反序列化。否则,您只会在MapStore中收到byte []。

答案 1 :(得分:0)

@kiran,

@wildnez的答案中的一些补充:

  1. 通常,如果您拥有Pojo并使用MapStore,则成员还需要了解Pojo。但是在您的情况下,由于您可以使用byte []正常运行,因此可以从客户端将条目存储为byte [],这意味着您的IMap必须是IMap。这样,成员将不值得进行任何反序列化。因此,您将手动进行序列化并将byte []存储到Hazelcast IMap中。另外,您可以为成员和客户端定义不同的序列化器/反序列化器,对于这些类,您始终可以在成员上返回byte []。我个人更喜欢第一个解决方案。

  2. *Store映射定义通配符IMap配置,并放置通用MapStore实现。通过实现MapLoaderLifecycleSupport,您还可以根据需要在MapStore中获取地图名称。请参阅http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#storing-entries-to-multiple-maps

  3. 如果您的地图是IMap,则您还将在MapStore中获得byte[],如1中所述。