第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 -
String -
Integer -
Long -
Double -
Float -
Boolean -
Short -
Character -
java.util.Date -
java.time.Instant
追加の型コレクション
ProtoStream ライブラリーには、一般的な Java の型用のアダプタークラスが複数含まれます。以下に例を示します。
-
java.math.BigDecimal -
java.math.BigInteger -
java.util.UUID -
java.util.BitSet
Data Grid は、protostream-types アーティファクトにある一部の一般的な JDK クラスのすべてのアダプタークラスを提供します。これは、infinispan-core および infinispan-client-hotrod 依存関係に含まれます。アダプタークラスをキーまたは値として保存する設定は必要ありません。
しかし、アダプタークラスを ProtoStream-annotated POJO でマーシャリング可能なフィールドとして使用する場合は、以下の方法で実行できます。
-
ProtoSchemaアノテーションのdependsOn要素を使用して、CommonTypesSchemaクラスとCommonContainerTypesSchemaクラスを指定します。
@ProtoSchema(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 {
}
@ProtoSchema(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 {
}
-
ProtoSchemaアノテーションのincludeClasses要素を使用して、必要なアダプタークラスを指定します。
@ProtoSchema(includeClasses = { Author.class, Book.class, UUIDAdapter.class, java.math.BigInteger }, schemaFileName = "library.proto", schemaFilePath = "proto", schemaPackageName = "library")
public interface LibraryInitalizer extends SerializationContextInitializer {
}
@ProtoSchema(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 パッケージのドキュメントを参照してください。
Proto
@Proto は、すべてのフィールドに @ProtoField アノテーションを付ける必要なく、Protocol Buffers メッセージを定義します。
- このアノテーションを使用すると、パブリックフィールドを持つレコードまたはクラスから、メッセージをすばやく生成できます。
- フィールドはパブリックである必要があり、宣言順序に基づいて増分番号が割り当てられます。
-
ProtoFieldアノテーションを使用して、フィールドの自動デフォルトをオーバーライドできます。
自動 Protobuf フィールド番号付けは、迅速なプロトタイピングにのみ使用してください。実稼働環境の場合は、スキーマとの将来的互換性/下位互換性を保証するために、Protocol Buffers のベストプラクティス に従う必要があります。
ProtoField
@ProtoField は Protobuf message フィールドを定義します。
このアノテーションは、フィールドだけでなく、getter メソッドと setter メソッドにも適用されます。@Proto アノテーションを使用していない限り、Data Grid が Protobuf としてマーシャリングする前に、クラスに @ProtoField アノテーションが付けられたフィールドを 1 つ以上設定する必要があります。
| パラメーター | 値 | 任意または必須 | 説明 |
|---|---|---|---|
|
| Integer | 必須 | タグ番号はクラス内で一意である必要があります。 |
|
| 型 | 任意 | フィールドの Protobuf 型を宣言します。型を指定しない場合は、Java プロパティーから推測されます。
Java |
|
| クラス | 任意 | プロパティーの型がインターフェイスまたは抽象クラスである場合に、実際のコレクションの型を示します。 |
|
| クラス | 任意 | プロパティータイプが抽象クラスまたはインターフェイスである場合に、実際の Java タイプを示します。この値は、プロパティータイプに対して割り当て可能なインスタンス化可能な Java タイプである必要があります。
|
|
| String | 任意 | Protobuf スキーマの名前を指定します。 |
|
| String | 任意 | キャッシュからの読み取り時に利用できない場合は、フィールドのデフォルト値を指定します。値は、Java フィールドタイプの正しい構文に従う必要があります。 |
ProtoFactory
@ProtoFactory は、メッセージクラスのインスタンスを作成するための単一のコンストラクターまたは静的ファクトリーメソッドをマークします。
このアノテーションを使用してイミュータブルメッセージクラスをサポートすることができます。@ProtoField アノテーションが付けられたフィールドはすべてパラメーターに追加する必要があります。
-
@ProtoFactoryコンストラクターまたはメソッドのフィールド名およびパラメーターは、対応する Protobuf メッセージと一致する必要がありますが、順番は重要ではありません。 -
@ProtoFactoryアノテーションが付けられたコンストラクターをクラスに追加しないと、そのクラスにはデフォルトの no-argument コンストラクターが必要です。そうしないと、コンパイル中にエラーが発生します。
ProtoSchema
@ProtoSchema は、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 を実装していない場合、または ProtoSchema でアノテーションが付けられていない場合は、コンパイル時エラーが発生します。
ProtoAdapter
@ProtoAdapter は、直接アノテーションを付けることができないクラスまたは列挙のマーシャリングアダプターです。
以下の項目に、このアノテーションを使用する場合、
-
クラス: アノテーションが付けられたクラスには、マーシャリングされたクラス用に
@ProtoFactoryアノテーションが付けられたファクトリーメソッド、および各フィールド用にアノテーション付きアクセサーメソッドが必要です。これらのメソッドはインスタンスまたは静的なメソッドにすることができます。また、最初の引数はマーシャリングされたクラスである必要があります。 - 列挙: 同じ名前の列挙値が、ターゲット列挙に存在している必要があります。
ProtoName
@ProtoName は、Protobuf メッセージまたは列挙型の名前を指定するオプションのアノテーションです。クラス、レコード、列挙で使用できます。
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 などの索引付けアノテーションが含まれます。