Hazelcast 序列化器 uuid 无法工作

问题描述 投票:0回答:2

在 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'。

java serialization hazelcast
2个回答
0
投票

这适用于 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());
}

我希望这有帮助。


0
投票

我想分享一个替代答案。

HZ 将快照依赖项发布到 oss.sonatype 存储库。您可以通过以下链接探索说明性示例项目: https://github.com/OrcunColak/hzsnapshottutorial

在这个项目中,你会发现:

  1. 演示如何利用 Hazelcast 快照依赖项。 请注意,工件名称与 Maven Central 上的实际工件名称不同。
  2. 基于我最初回复中提供的详细信息成功实现 CompactSerializer 的示例..

随意克隆演示项目并验证其功能。重要的是,不需要 Docker、Kubernetes 等来运行这个示例。

© www.soinside.com 2019 - 2024. All rights reserved.