第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 {
}
Copy to Clipboard Toggle word wrap
  • 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 {

}
Copy to Clipboard Toggle word wrap

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 つ以上設定する必要があります。

Expand
パラメーター任意または必須説明

number

Integer

必須

タグ番号はクラス内で一意である必要があります。

type

任意

フィールドの Protobuf 型を宣言します。型を指定しない場合は、Java プロパティーから推測されます。

Java intfixed32 に変更する場合と同様に、@ProtoField(type) 要素を使用して Protobuf 型を変更できます。Java プロパティーに互換性のない宣言を使用すると、コンパイラーエラーが発生します。

collectionImplementation

クラス

任意

プロパティーの型がインターフェイスまたは抽象クラスである場合に、実際のコレクションの型を示します。

javaType

クラス

任意

プロパティータイプが抽象クラスまたはインターフェイスである場合に、実際の Java タイプを示します。この値は、プロパティータイプに対して割り当て可能なインスタンス化可能な Java タイプである必要があります。

javaType パラメーターでタイプを宣言する場合、すべてのユーザーコードはそのタイプに準拠する必要があります。エントリー用に生成されたマーシャラーは、アンマーシャリングの場合にその実装を使用します。ローカルクライアントが宣言とは異なる実装を使用する場合は、ClassCastExceptions が発生します。

name

String

任意

Protobuf スキーマの名前を指定します。

defaultValue

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 などの索引付けアノテーションが含まれます。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat