第 4 章 数据转换
Data Grid 使用 transcoders 在由介质类型标识的不同编码之间转换数据。
4.1. hot Rod DataFormat API
通过 Hot Rod 端点对远程缓存的读写操作默认使用客户端 marshaller。热 Rod 为 Java 客户端提供 DataFormat
API,您可以使用它来执行具有不同介质类型 encodings 和/或 marshallers 的缓存操作。
键和值的不同 marshallers
您可以在运行时覆盖键和值的 marshallers。
例如,要绕过 Hot Rod 客户端中的所有序列化,并读取存储在远程缓存中的 byte[]
数组:
// Existing RemoteCache instance RemoteCache<String, Pojo> remoteCache = ... // IdentityMarshaller is a no-op marshaller DataFormat rawKeyAndValues = DataFormat.builder() .keyMarshaller(IdentityMarshaller.INSTANCE) .valueMarshaller(IdentityMarshaller.INSTANCE) .build(); // Creates a new instance of RemoteCache with the supplied DataFormat RemoteCache<byte[], byte[]> rawResultsCache = remoteCache.withDataFormat(rawKeyAndValues);
对带有 keyMarshaller ()
和 keyType ()
方法的密钥使用不同的 marshallers 和数据格式可能会影响客户端智能路由机制,从而导致 Data Grid 集群中的额外网络跃点。如果性能至关重要,您应该对客户端和服务器中的密钥使用相同的编码。
读取不同编码中的数据
根据 org.infinispan.commons.dataconversion.MediaType
指定的不同编码请求并发送数据,如下所示:
// Existing remote cache using ProtostreamMarshaller RemoteCache<String, Pojo> protobufCache = ... // Request values returned as JSON // Use the UTF8StringMarshaller to convert UTF-8 to String DataFormat jsonString = DataFormat.builder() .valueType(MediaType.APPLICATION_JSON) .valueMarshaller(new UTF8StringMarshaller()) .build(); RemoteCache<byte[], byte[]> rawResultsCache = protobufCache.withDataFormat(jsonString);
使用自定义值 marshallers
您可以将自定义 marshallers 用于值,如下例所示,它将值返回为 org.codehaus.jackson.JsonNode
对象。
在本例中,Data Grid 服务器处理数据转换,并在不支持指定的介质类型时抛出异常。
DataFormat jsonNode = DataFormat.builder() .valueType(MediaType.APPLICATION_JSON) .valueMarshaller(new CustomJacksonMarshaller() .build(); RemoteCache<String, JsonNode> jsonNodeCache = remoteCache.withDataFormat(jsonNode);
将值返回为 XML
以下代码片段返回值为 XML:
Object xmlValue = remoteCache .withDataFormat(DataFormat.builder() .valueType(MediaType.APPLICATION_XML) .valueMarshaller(new UTF8StringMarshaller()) .build()) .get(key);
例如,前面的 get (key)
调用返回值,例如:
<?xml version="1.0" ?><string>Hello!</string>