Hazelcast UUID自定义Compact序列化失效问题求助
Hazelcast UUID字段序列化错误处理方案
问题背景
将包含UUID字段的Booster对象存入Hazelcast的IMAP时触发序列化错误,尝试自定义CompactSerializer<UUID>时出现两类报错:
报错1(开启setAllowOverrideDefaultSerializers(true)时)
java.lang.IllegalArgumentException: Compact serializer for the class 'class java.util.UUID can not be registered as it overrides the default serializer for that class provided by Hazelcast.
报错2(未开启setAllowOverrideDefaultSerializers(true)时)
com.hazelcast.nio.serialization.HazelcastSerializationException: The 'class java.util.UUID' cannot be serialized with zero configuration Compact serialization because this type is not supported yet. If you want to serialize 'class net.star.api.impl.common.booster.Booster' which uses this class in its fields, consider writing a CompactSerializer for either the 'class net.star.api.impl.common.booster.Booster' or the 'class java.util.UUID'.
解决方案
方案1:为Booster类编写CompactSerializer(推荐)
无需覆盖UUID的默认序列化逻辑,直接为包含UUID字段的Booster类实现序列化,避免与Hazelcast内置序列化冲突:
public class BoosterSerializer implements CompactSerializer<Booster> { @Override public @NotNull Booster read(CompactReader reader) { Booster booster = new Booster(); // 读取Booster的其他字段 booster.setId(reader.readUUID("id")); // 使用Hazelcast内置UUID读取方法 // 读取其他业务字段... return booster; } @Override public void write(@Nonnull CompactWriter writer, @Nonnull Booster object) { // 写入Booster的其他字段 writer.writeUUID("id", object.getId()); // 使用Hazelcast内置UUID写入方法 // 写入其他业务字段... } @Override public @NotNull Class<Booster> getCompactClass() { return Booster.class; } @Override public @NotNull String getTypeName() { return "Booster"; } }
客户端配置中注册该序列化器:
ClientConfig clientConfig = new ClientConfig(); clientConfig.getSerializationConfig() .getCompactSerializationConfig() .addSerializer(new BoosterSerializer()); clientConfig.getNetworkConfig().addAddress("hazelcast-service:5701"); this.hazelcastInstance = HazelcastClient.newHazelcastClient(clientConfig);
方案2:正确覆盖UUID的默认序列化(不推荐,除非必须)
若一定要为UUID自定义序列化,需保证序列化器的typeName与Hazelcast默认UUID类型名一致,同时正确开启覆盖配置:
修改自定义UUID序列化器的getTypeName()方法:
public class CustomUUIDSerializer implements CompactSerializer<UUID> { @Override public @NotNull UUID read(CompactReader reader) { return UUID.fromString(Objects.requireNonNull(reader.readString("uuidField"))); } @Override public void write(@Nonnull CompactWriter writer, @Nonnull UUID object) { writer.writeString("uuidField", object.toString()); } @Override public @NotNull Class<UUID> getCompactClass() { return UUID.class; } @Override public @NotNull String getTypeName() { return "java.util.UUID"; // 改为Hazelcast默认的UUID类型名 } }
客户端配置中正确开启覆盖并注册序列化器:
ClientConfig clientConfig = new ClientConfig(); // 先设置允许覆盖默认序列化器 clientConfig.getSerializationConfig().setAllowOverrideDefaultSerializers(true); // 注册自定义UUID序列化器 clientConfig.getSerializationConfig() .getCompactSerializationConfig() .addSerializer(new CustomUUIDSerializer()); clientConfig.getNetworkConfig().addAddress("hazelcast-service:5701"); this.hazelcastInstance = HazelcastClient.newHazelcastClient(clientConfig);
注意:覆盖默认序列化器可能引发Hazelcast内部逻辑兼容性问题,优先选择方案1。
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

