在 github 上进行多次搜索和请求结果后,使用 hazelcast 进行缓存时出现错误,但我仍然没有解决方案。这是我的问题,我想在 IMAP 中存储一个助推器,其中包含助推器对象中的 uuid 和助推器对象,因此我有助推器的 uuid 类型以及由谁激活以及将其保存在错误图。
这是获得的代码和错误
ClientConfig clientConfig = new ClientConfig();
clientConfig.getSerializationConfig().setAllowOverrideDefaultSerializers(true);
clientConfig.getSerializationConfig()
.getCompactSerializationConfig()
.addSerializer(new CustomUUIDSerializer());
clientConfig.getNetworkConfig().addAddress("hazelcast-service:5701");
this.hazelcastInstance = HazelcastClient.newHazelcastClient(clientConfig);
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 "UUID";
}
java.lang.IllegalArgumentException:无法注册类“class java.util.UUID”的紧凑序列化程序,因为它会覆盖 Hazelcast 提供的该类的默认序列化程序。
我当然之前没有尝试过,这是错误
com.hazelcast.nio.serialization.HazelcastSerializationException:“类 java.util.UUID”无法使用零配置紧凑序列化进行序列化,因为尚不支持此类型。如果要序列化在其字段中使用此类的“class net.star.api.impl.common.booster.Booster”,请考虑为“class net.star.api.impl.common.booster”编写一个 CompactSerializer。 Booster' 或 'class java.util.UUID'。
这适用于 HZ 5.4.0-SNAPSHOT 版本。我有带有 UUID 字段的值对象。
我为我的值对象创建了一个新的序列化器并将其添加到ClientConfig
注意:我也尝试像您一样为 UUID 注册自定义序列化器,这也适用于 HZ 5.4.0-SNAPSHOT 版本。 我不会在这里发布代码,因为我认为为值对象提供客户序列化器会更好。也许问题是你使用的 HZ 版本?
@Getter
@Setter
class UUIDValueObject {
private UUID uuid;
public static UUIDValueObject createNew () {
UUIDValueObject valueObject = new UUIDValueObject();
valueObject.setUuid(UUID.randomUUID());
return valueObject;
}
}
值对象的序列化器
class UUIDValueObjectSerializer implements CompactSerializer<UUIDValueObject> {
@Override
public UUIDValueObject read(CompactReader reader) {
UUIDValueObject valueObject = new UUIDValueObject();
String uuidField = reader.readString("uuidField");
assert uuidField != null;
UUID uuid = UUID.fromString(uuidField);
valueObject.setUuid(uuid);
return valueObject;
}
@Override
public void write(CompactWriter writer, UUIDValueObject uuidValueObject) {
UUID uuid = uuidValueObject.getUuid();
writer.writeString("uuidField", uuid.toString());
}
@Override
public String getTypeName() {
return "UUIDValueObject";
}
@Override
public Class<UUIDValueObject> getCompactClass() {
return UUIDValueObject.class;
}
}
然后使用序列化器创建 HZ 客户端
HazelcastInstance getHazelcastClientInstance() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.getSerializationConfig()
.getCompactSerializationConfig()
.addSerializer(new UUIDValueObjectSerializer());
return HazelcastClient.newHazelcastClient(clientConfig);
}
我正在填充 IMap
void populateMap(HazelcastInstance hazelcastClientInstance) {
IMap<Integer, UUIDValueObject> myMap =
hazelcastClientInstance.getMap(MAP_NAME);
myMap.put(KEY, UUIDValueObject.createNew());
}
我希望这有帮助。
我想分享一个替代答案。
HZ 将快照依赖项发布到 oss.sonatype 存储库。您可以通过以下链接探索说明性示例项目: https://github.com/OrcunColak/hzsnapshottutorial
在这个项目中,你会发现:
随意克隆演示项目并验证其功能。重要的是,不需要 Docker、Kubernetes 等来运行这个示例。