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

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

number

整数

必須

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

type

任意

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

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

collectionImplementation

クラス

任意

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

javaType

クラス

任意

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

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

name

文字列

任意

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

defaultValue

文字列

任意

キャッシュからの読み取り時に利用できない場合は、フィールドのデフォルト値を指定します。値は、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 でサポートされなくなり、今後削除される可能性があるため、このアノテーションの使用は推奨していません。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.