从Infinispan 7更新到10,如何将UUID作为UUID的键作为类中的字段处理?

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

我正在尝试将使用Infinispan 7的大型项目更新到v10.1.3。

我想使用新的protostream编组器,但我不明白如何使用UUID作为缓存键,甚至(更容易?)作为要插入缓存的类中的字段。

这样访问我的缓存:Map<UUID, Foo> testUUIDAsKey = manager.getCache("t1");

[在这里尝试将值放入缓存时,infinispan告诉我他不知道如何编组uuid。

好,所以在阅读了文档之后,我尝试切换到一个更简单的测试用例:Map<String, Bar> testUUIDAsField = manager.getCache("t2");

[Bar类有一个UUID类型的字段,我尝试使用protostream注释处理器,当使用正确的注释时,该处理器将自动生成并构建一个proto文件。

但是这次,注释处理器告诉我,必须使用可访问的无参数构造函数将UUID类实例化。

[我知道protobuf无法管理UUID,我可以将值存储为字符串或通过存储uuid的2个long值部分。

我如何注册最终将使用String作为其表示形式的UUID编组器?

而且我如何告诉注释处理器必须使用此编组器?

然后,如何使用UUID作为密钥?

谢谢。

java marshalling infinispan
1个回答
3
投票

当前,Infinispan为UUID注册了Protostream编组器,但不幸的是,它仅在服务器中。我创建了ISPN-11426以使其能够在以后的发行版(10.1.4.Final和11.x)中以嵌入式模式开箱即用地编排UUID。

同时,您可以通过创建SerializationContextInitializer并定义UUIDMarshaller类来使UUID用作键:


       public static class Initializer implements SerializationContextInitializer {

          @Override
          public String getProtoFileName() {
             return "org.example.package.proto";
          }

          @Override
          public String getProtoFile() throws UncheckedIOException {
             return "package org.example.package;\n" +
                   "message UUID {\n" +
                   "    optional string value = 1;\n" +
                   "}\n";
          }

          @Override
          public void registerSchema(SerializationContext serCtx) {
             serCtx.registerProtoFiles(org.infinispan.protostream.FileDescriptorSource.fromString(getProtoFileName(), getProtoFile()));
          }

          @Override
          public void registerMarshallers(SerializationContext serCtx) {
             serCtx.registerMarshaller(new UUIDMarshaller("org.example.package.UUID"));
          }
       }

    public class UUIDMarshaller implements MessageMarshaller<UUID> {

       private final String typeName;

       /**
        * @param typeName so that marshaller can be used in multiple contexts
        */
       public UUIDMarshaller(String typeName) {
          this.typeName = typeName;
       }

       @Override
       public UUID readFrom(ProtoStreamReader reader) throws IOException {
          return UUID.fromString(reader.readString("value"));
       }

       @Override
       public void writeTo(ProtoStreamWriter writer, UUID uuid) throws IOException {
          writer.writeString("value", uuid.toString());
       }

       @Override
       public Class<? extends UUID> getJavaClass() {
          return UUID.class;
       }

       @Override
       public String getTypeName() {
          return typeName;
       }
    }

您需要将org.example.package更新为与您的项目相关的内容。

然后可以通过以下方式以编程方式提供Initializer类:

new GlobalConfigurationBuilder().serialization().addContextInitializer(new Initializer());

或通过xml:

      <serialization>
         <context-initializer class="org.example.package.Initializer" />
      </serialization>
© www.soinside.com 2019 - 2024. All rights reserved.