Hazelcast 为客户端和 mapstore 进行不同的(反)序列化
Hazelcast different (de)serialization for clients and mapstore
我是 运行 hazelcast 成员和客户,背景如下:
如上图所示:
- 我希望客户控制(反)序列化,并在没有 hazelcast 成员参与序列化业务的情况下加入新客户。
- 想要根据命名约定使 Hazelcast Map 持久化,例如所有带有“*Store”匹配模式的地图,需要持久化到cassandra db。
- 因为我选择坚持二进制格式,所以我希望将存储在 hazelcast 中的相同 byte[] 提供给 mapstore 接口。
我的问题是 - hazelcast 似乎在调用 mapstore .store() 方法之前应用了反序列化器,并在服务器端查找具有最初存储的 typeId 的序列化器 class。合乎逻辑的解决方案是,如果我的 mapstore 类型是 byte[],hazelcast 不会为 mapstore 应用反序列化器,或者让我定义反序列化器,无论 typeId 如何都可以工作。看起来两者似乎都不可能。
非常感谢任何解决问题的想法。
在默认情况下(内存格式设置为二进制)序列化和反序列化只发生在客户端。但是,您使用的 MapStore 需要 Hazelcast 向 MapStore.store 方法提供实际的条目对象,因此在服务器上进行反序列化。否则你只会在 MapStore 中收到一个 byte[]。
@kiran,
@wildnez 回答的一些补充:
通常情况下,如果您有 Pojo 并使用 MapStore,会员也需要了解 Pojo。但在你的情况下,因为你可以使用 byte[],你可以从客户端将条目存储为 byte[],这意味着你的 IMap 必须是 IMap。那么成员将不会进行任何反序列化处理。因此,您将手动进行序列化并将 byte[] 存储到 Hazelcast IMap。作为替代方案,您可以为成员和客户定义不同的 serializers/deserializers,对于那些 类,您始终可以在成员上 return byte[]。我个人更喜欢第一种方案。
为 *Store
地图定义一个通配符 IMap 配置并放置一个通用的 MapStore 实现。通过实现 MapLoaderLifecycleSupport
,如果需要,您还可以在 MapStore 中获取地图名称。请参阅 http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#storing-entries-to-multiple-maps
如果您的地图是 IMap,那么您也会在 MapStore 中获得 byte[]
,如 1.
中所述
我是 运行 hazelcast 成员和客户,背景如下:
- 我希望客户控制(反)序列化,并在没有 hazelcast 成员参与序列化业务的情况下加入新客户。
- 想要根据命名约定使 Hazelcast Map 持久化,例如所有带有“*Store”匹配模式的地图,需要持久化到cassandra db。
- 因为我选择坚持二进制格式,所以我希望将存储在 hazelcast 中的相同 byte[] 提供给 mapstore 接口。
我的问题是 - hazelcast 似乎在调用 mapstore .store() 方法之前应用了反序列化器,并在服务器端查找具有最初存储的 typeId 的序列化器 class。合乎逻辑的解决方案是,如果我的 mapstore 类型是 byte[],hazelcast 不会为 mapstore 应用反序列化器,或者让我定义反序列化器,无论 typeId 如何都可以工作。看起来两者似乎都不可能。
非常感谢任何解决问题的想法。
在默认情况下(内存格式设置为二进制)序列化和反序列化只发生在客户端。但是,您使用的 MapStore 需要 Hazelcast 向 MapStore.store 方法提供实际的条目对象,因此在服务器上进行反序列化。否则你只会在 MapStore 中收到一个 byte[]。
@kiran,
@wildnez 回答的一些补充:
通常情况下,如果您有 Pojo 并使用 MapStore,会员也需要了解 Pojo。但在你的情况下,因为你可以使用 byte[],你可以从客户端将条目存储为 byte[],这意味着你的 IMap 必须是 IMap。那么成员将不会进行任何反序列化处理。因此,您将手动进行序列化并将 byte[] 存储到 Hazelcast IMap。作为替代方案,您可以为成员和客户定义不同的 serializers/deserializers,对于那些 类,您始终可以在成员上 return byte[]。我个人更喜欢第一种方案。
为
*Store
地图定义一个通配符 IMap 配置并放置一个通用的 MapStore 实现。通过实现MapLoaderLifecycleSupport
,如果需要,您还可以在 MapStore 中获取地图名称。请参阅 http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#storing-entries-to-multiple-maps如果您的地图是 IMap,那么您也会在 MapStore 中获得
byte[]
,如 1. 中所述