从 Infinispan 7 更新到 10,如何处理 UUID as key of UUID as field in a class?
Updating from Infinispan 7 to 10, how to deal with UUID as key of UUID as field in a class?
我正在尝试将一个使用 Infinispan 7 的大项目更新到 v10.1.3。
我想使用新的 protostream 编组器,但我不明白如何使用 UUID 作为缓存键,甚至(更简单?)作为我 class 中的一个字段想插入缓存。
我的缓存是这样访问的:Map<UUID, Foo> testUUIDAsKey = manager.getCache("t1");
在这里,当试图将值放入缓存时,infinispan 告诉我他不知道如何编组 uuid。
好的,所以在阅读文档后,我尝试切换到更简单的测试用例:Map<String, Bar> testUUIDAsField = manager.getCache("t2");
这里,Bar class 有一个 UUID 类型的字段,我尝试使用 protostream 注释处理器,当使用正确的注释时,它会自动生成并构建一个 proto 文件。
但是这一次,注释处理器告诉我 UUID class 必须使用可访问的无参数构造函数来实例化。
我知道 protobuf 无法管理 UUID,我可以将值存储为字符串或通过存储 uuid 的 2 个长值部分。
我如何注册一个 UUID 编组器,它最终会使用 String 作为它的表示?
我如何告诉注释处理器它必须使用这个编组器?
那么,如何使用UUID作为key呢?
谢谢。
目前 Infinispan 为 UUID 注册了一个 Protostream 编组器,但不幸的是它只在服务器中。我创建了 ISPN-11426 以便在未来的版本(10.1.4.Final 和 11.x)中以嵌入模式开箱即用地编组 UUID。
同时,您可以通过创建一个 SerializationContextInitializer 并定义一个 UUIDMarshaller
class:
来让 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"));
}
}
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
更新为与您的项目相关的内容。
然后可以通过以下方式以编程方式提供初始化程序 class:
new GlobalConfigurationBuilder().serialization().addContextInitializer(new Initializer());
或通过xml:
<serialization>
<context-initializer class="org.example.package.Initializer" />
</serialization>
我正在尝试将一个使用 Infinispan 7 的大项目更新到 v10.1.3。
我想使用新的 protostream 编组器,但我不明白如何使用 UUID 作为缓存键,甚至(更简单?)作为我 class 中的一个字段想插入缓存。
我的缓存是这样访问的:Map<UUID, Foo> testUUIDAsKey = manager.getCache("t1");
在这里,当试图将值放入缓存时,infinispan 告诉我他不知道如何编组 uuid。
好的,所以在阅读文档后,我尝试切换到更简单的测试用例:Map<String, Bar> testUUIDAsField = manager.getCache("t2");
这里,Bar class 有一个 UUID 类型的字段,我尝试使用 protostream 注释处理器,当使用正确的注释时,它会自动生成并构建一个 proto 文件。
但是这一次,注释处理器告诉我 UUID class 必须使用可访问的无参数构造函数来实例化。
我知道 protobuf 无法管理 UUID,我可以将值存储为字符串或通过存储 uuid 的 2 个长值部分。
我如何注册一个 UUID 编组器,它最终会使用 String 作为它的表示?
我如何告诉注释处理器它必须使用这个编组器?
那么,如何使用UUID作为key呢?
谢谢。
目前 Infinispan 为 UUID 注册了一个 Protostream 编组器,但不幸的是它只在服务器中。我创建了 ISPN-11426 以便在未来的版本(10.1.4.Final 和 11.x)中以嵌入模式开箱即用地编组 UUID。
同时,您可以通过创建一个 SerializationContextInitializer 并定义一个 UUIDMarshaller
class:
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"));
}
}
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
更新为与您的项目相关的内容。
然后可以通过以下方式以编程方式提供初始化程序 class:
new GlobalConfigurationBuilder().serialization().addContextInitializer(new Initializer());
或通过xml:
<serialization>
<context-initializer class="org.example.package.Initializer" />
</serialization>