第4章 データ変換
Data Grid はトランスコーダーを使用して、メディアタイプで識別されるさまざまなエンコーディング間でデータを変換します。
4.1. Hot Rod DataFormat API リンクのコピーリンクがクリップボードにコピーされました!
Hot Rod エンドポイントを使用したリモートキャッシュでの読み取り操作および書き込み操作は、デフォルトでクライアントマーシャラーを使用します。Hot Rod は、異なるメディアタイプエンコーディングやマーシャラーを使用してキャッシュ操作を実行するのに使用できる Java クライアントの DataFormat API を提供します。
キーと値の異なるマーシャラー
実行時にキーと値のマーシャラーを上書きできます。
たとえば、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() メソッドでキーに異なるマーシャラーとデータ形式を使用すると、クライアントインテリジェンスルーティングメカニズムに干渉する可能性があり、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);
カスタム値マーシャラーの使用
org.codehaus.jackson.JsonNode オブジェクトとして値を返す以下の例のように、値にカスタムマーシャラーを使用できます。
この例では、Data Grid Server はデータ変換を処理し、指定したメディアタイプに対応していない場合は例外を出力します。
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>