第2章 ProtoStream を使用したカスタムオブジェクトのマーシャリング
マーシャリングは、Java オブジェクトをバイナリー形式に変換して、ネットワーク全体で転送したり、ディスクに格納したりできるプロセスです。逆プロセスのアンマーシャリングは、データをバイナリー形式から Java オブジェクトに変換します。
Data Grid は、マーシャリングとアンマーシャリングを実行し、以下を行います。
- クラスターの他の Data Grid ノードにデータを送信します。
- データを永続キャッシュストアに保存します。
- クライアントとリモートキャッシュ間でオブジェクトを送信します。
- JVM ヒープ外にあるネイティブメモリーにオブジェクトを保存します。
-
キャッシュエンコーディングが
application/x-java-objectではない場合に、オブジェクトを JVM ヒープメモリーに保存します。
Data Grid キャッシュにカスタムオブジェクトを保存する場合は、ProtoStream マーシャラーで Protobuf ベースのマーシャリングを使用する必要があります。
2.1. ProtoStream マーシャリング リンクのコピーリンクがクリップボードにコピーされました!
Data Grid は ProtoStream API を提供するため、Java オブジェクトを Protocol Buffers(Protobuf) としてマーシャリングできます。
ProtoStream は、多くの異なる Java データ型をネイティブにサポートします。つまり、これらのタイプに ProtoStream マーシャリングを設定する必要はありません。カスタムまたはユーザータイプの場合、Data Grid が、これらのオブジェクトをキャッシュとの間でマーシャリングできるように情報を提供する必要があります。
SerializationContext-
Protobuf スキーマ (
.protoファイル) から読み込まれる Protobuf タイプの定義が含まれるリポジトリー、および付随マーシャラー。 SerializationContextInitializer-
SerializationContextを初期化するインターフェイス。
2.1.1. ProtoStream タイプ リンクのコピーリンクがクリップボードにコピーされました!
Data Grid は、キーと値の以下の型、およびプリミティブタイプの場合にボックスのない同等を処理できる ProtoStream ライブラリーを使用します。
-
byte[] -
Byte -
文字列 -
整数 -
ロング -
Double -
Float -
Boolean -
Short -
Character -
java.util.Date -
java.time.Instant
追加のタイプコレクション
ProtoStream ライブラリーには、一般的な Java タイプ用のアダプタークラスが複数含まれます。以下に例を示します。
-
java.math.BigDecimal -
java.math.BigInteger -
java.util.UUID
Data Grid は、protostream-types アーティファクトにある一部の一般的な JDK クラスのすべてのアダプタークラスを提供します。これは、infinispan-core および infinispan-client-hotrod 依存関係に含まれます。アダプタークラスをキーまたは値として保存する設定は必要ありません。
しかし、アダプタークラスを ProtoStream annotated POJOS でマーシャリング可能なフィールドとして使用する場合は、以下の方法で実行できます。
-
AutoProtoSchemaBuilderアノテーションのdependsOn要素を使用して、CommonTypesSchemaおよびCommonContainerTypesSchemaクラスを指定します。
@AutoProtoSchemaBuilder(dependsOn = {org.infinispan.protostream.types.java.CommonTypes, org.infinispan.protostream.types.java.CommonContainerTypes}, schemaFileName = "library.proto", schemaFilePath = "proto", schemaPackageName = "example")
public interface LibraryInitalizer extends SerializationContextInitializer {
}
@AutoProtoSchemaBuilder(dependsOn = {org.infinispan.protostream.types.java.CommonTypes, org.infinispan.protostream.types.java.CommonContainerTypes}, schemaFileName = "library.proto", schemaFilePath = "proto", schemaPackageName = "example")
public interface LibraryInitalizer extends SerializationContextInitializer {
}
-
AutoProtoSchemaBuilderアノテーションのincludeClasses要素で必要なアダプタークラスを指定します。
@AutoProtoSchemaBuilder(includeClasses = { Author.class, Book.class, UUIDAdapter.class, java.math.BigInteger }, schemaFileName = "library.proto", schemaFilePath = "proto", schemaPackageName = "library")
public interface LibraryInitalizer extends SerializationContextInitializer {
}
@AutoProtoSchemaBuilder(includeClasses = { Author.class, Book.class, UUIDAdapter.class, java.math.BigInteger }, schemaFileName = "library.proto", schemaFilePath = "proto", schemaPackageName = "library")
public interface LibraryInitalizer extends SerializationContextInitializer {
}
2.1.2. ProtoStream アノテーション リンクのコピーリンクがクリップボードにコピーされました!
ProtoStream API には、Protobuf スキーマを定義するために Java アプリケーションに追加できるアノテーションが含まれます。これにより、オブジェクトに構造化された形式が提供されます。
このトピックでは、ProtoStream アノテーションに関する追加情報を提供します。詳細は、org.infinispan.protostream.annotations パッケージのドキュメントを参照してください。
ProtoField
@ProtoField は Protobuf message フィールドを定義します。
このアノテーションは必須で、getter メソッドおよび setter メソッドにくわえてフィールドにも適用されます。Data Grid が Protobuf としてマーシャリングする前に、クラスに @ProtoField アノテーションが付けられたフィールドを 1 つ以上設定する必要があります。
| パラメーター | 値 | 任意または必須 | 説明 |
|---|---|---|---|
|
| 整数 | 必須 | タグ番号はクラス内で一意である必要があります。 |
|
| 型 | 任意 | フィールドの Protobuf タイプを宣言します。タイプを指定しない場合は、Java プロパティーから推測されます。
Java |
|
| クラス | 任意 | プロパティータイプがインターフェイスまたは抽象クラスである場合に、実際のコレクションタイプを示します。 |
|
| クラス | 任意 | プロパティータイプが抽象クラスまたはインターフェイスである場合に、実際の Java タイプを示します。この値は、プロパティータイプに対して割り当て可能なインスタンス化可能な Java タイプである必要があります。
|
|
| 文字列 | 任意 | Protobuf スキーマの名前を指定します。 |
|
| 文字列 | 任意 | キャッシュからの読み取り時に利用できない場合は、フィールドのデフォルト値を指定します。値は、Java フィールドタイプの正しい構文に従う必要があります。 |
ProtoFactory
@ProtoFactory は、メッセージクラスのインスタンスを作成するための単一のコンストラクターまたは静的ファクトリーメソッドをマークします。
このアノテーションを使用してイミュータブルメッセージクラスをサポートすることができます。@ProtoField アノテーションが付けられたフィールドはすべてパラメーターに追加する必要があります。
-
@ProtoFactoryコンストラクターまたはメソッドのフィールド名およびパラメーターは、対応する Protobuf メッセージと一致する必要がありますが、順番は重要ではありません。 -
@ProtoFactoryアノテーションが付けられたコンストラクターをクラスに追加しないと、そのクラスにはデフォルトの no-argument コンストラクターが必要です。そうしないと、コンパイル中にエラーが発生します。
AutoProtoSchemaBuilder
@AutoProtoSchemaBuilder は、SerializationContextInitializer を拡張するクラスまたはインターフェイスの実装を生成します。
アクティブの場合、ProtoStream プロセッサーは、Impl 接尾辞または className パラメーターで指定した名前と同じパッケージで、コンパイル時に実装を生成します。
includeClasses または basePackages パラメーターは、ProtoStream プロセッサーがスキャンして Protobuf スキーマおよびマーシャラーに含める必要があるクラスを参照します。これらのパラメーターのいずれかを設定しないと、ProtoStream プロセッサーはソースパス全体をスキャンします。これにより、予期しない結果が発生する可能性があり、推奨されません。basePackages パラメーターと excludeClasses パラメーターを使用して、クラスを除外することもできます。
schemaFileName パラメーターおよび schemaPackageName パラメーターは、この名前で生成された Protobuf スキーマを登録します。これらのパラメーターを設定しないと、アノテーション付きの単純なクラス名が名前なしまたは デフォルトパッケージで使用されます。スキーマ名は、.proto ファイル拡張子で終了する必要があります。marshallersOnly を使用してマーシャラーのみを生成し、Protobuf スキーマの生成を抑制することもできます。
ProtoStream プロセスは、META-INF/services サービスメタデータファイルを自動的に生成します。このファイルを使用すると、Data Grid Server が JAR を自動的に検出して Protobuf スキーマを登録します。
dependsOn パラメーターは、最初に実行するように SerializedContextInitializer を実装するアノテーション付きクラスをリスト表示します。クラスが SerializedContextInitializer を実装していないか、AutoProtoSchemaBuilder のアノテーションが付けられた場合は、コンパイル時間エラーが発生します。
ProtoAdapter
@ProtoAdapter は、直接アノテーションを付けることができないクラスまたは列挙のマーシャリングアダプターです。
以下の項目に、このアノテーションを使用する場合、
-
クラス: アノテーションが付けられたクラスには、マーシャリングされたクラス用に
@ProtoFactoryアノテーションが付けられたファクトリーメソッド、および各フィールド用にアノテーション付きアクセサーメソッドが必要です。これらのメソッドはインスタンスまたは静的なメソッドにすることができます。また、最初の引数はマーシャリングされたクラスである必要があります。 - 列挙: 同じ名前の列挙値が、ターゲット列挙に存在している必要があります。
ProtoName
@protoName は、Protobuf メッセージまたは列挙型名を指定し、@ProtoMessage アノテーションを置き換えるオプションのアノテーションです。
ProtoEnumValue
@ProtoEnumValue は Protobuf 列挙値を定義します。このアノテーションは、Java enum のメンバーにのみ適用できます。
ProtoReserved および ProtoReservedStatements
@ProtoReserved および @ProtoReservedStatements は、生成されたメッセージまたは列挙定義に reserved ステートメントを追加し、番号、範囲、および名前の使用を防ぎます。
ProtoTypeId
@ProtoTypeId は任意で、Protobuf メッセージまたは enum タイプのグローバル一意の数値型識別子を指定します。
Data Grid は内部的にこのアノテーションを使用し、識別子は通知なしに変更できるため、このアノテーションをクラスに追加しないでください。
ProtoUnknownFieldSet
@ProtoUnknownFieldSet はオプションで、未知のフィールドを保存するタイプ {@link org.infinispan.protostream.UnknownFieldSet} のフィールドまたは JavaBean プロパティーを示します。
]Data Grid は、Google でサポートされなくなり、今後削除される可能性があるため、このアノテーションの使用は推奨していません。
その他の注釈
Data Grid は、クラス、フィールド、およびメソッドのその他の注釈を、生成された Protobuf スキーマにコメントとしてコピーします。これには、@Indexed や @Basic などの索引付けアノテーションが含まれます。