第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
-
文字列
-
整数
-
Long
-
double
-
Float
-
ブール値
-
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
アノテーションのincludeClasses
要素で必要なアダプタークラスを指定します。
@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
アノテーションが付けられたファクトリーメソッド、および各フィールド用にアノテーション付きアクセサーメソッドが必要です。これらのメソッドはインスタンスまたは静的なメソッドにすることができます。また、最初の引数はマーシャリングされたクラスである必要があります。 - 列挙: 同じ名前の列挙値が、ターゲット列挙に存在している必要があります。
ProtoDoc および ProtoDocs
@ProtoDoc
および @ProtoDocs
は、生成されたスキーマのメッセージタイプ、列挙、またはフィールドを文書化する人間が判読できるテキストです。
これらのアノテーションを使用して、Ickle クエリーのインデックスを設定します。
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 でサポートされなくなり、今後削除される可能性があるため、このアノテーションの使用は推奨していません。