首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Infinispan 7到10的更新,如何处理UUID作为类中字段的键?

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

Stack Overflow用户
提问于 2020-02-28 12:15:00
回答 1查看 425关注 0票数 1

我正在尝试更新一个使用Infinispan 7到10.1.3版本的大型项目。

我想使用新的原流封送处理程序,但我不明白如何使用UUID作为缓存密钥,甚至(更容易吗?)作为要插入缓存中的类中的字段。

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

在这里,当试图将值放入缓存时,无穷大告诉我,他不知道如何封送uuid。

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

在这里,Bar类有一个类型为UUID的字段,我尝试使用原流注释处理器,当正确的注释被使用时,它将自动生成并构建proto文件。

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

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

如何注册最终使用字符串表示的UUID封送处理程序?

我如何告诉注释处理器它必须使用这个封送处理程序?

那么,我如何使用UUID作为密钥呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-05 12:18:03

目前,Infinispan为UUID注册了一个Protostream封送处理程序,但不幸的是,它仅在服务器中。我创建ISPN-11426是为了使UUID能够在未来的版本(10.1.4.Final和11.x)中在嵌入式模式下被封送。

同时,您可以通过创建一个SerializationContextInitializer和定义一个UUIDMarshaller类来使UUID作为键工作:

代码语言:javascript
运行
复制
       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"));
          }
       }
代码语言:javascript
运行
复制
    import java.io.IOException;
    import java.util.UUID;

    import org.infinispan.protostream.MessageMarshaller;

    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更新为与您的项目相关的内容。

然后,可以通过以下方式以编程方式提供初始化程序类:

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

或者通过xml:

代码语言:javascript
运行
复制
      <serialization>
         <context-initializer class="org.example.package.Initializer" />
      </serialization>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60451524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档