5.2. AutoProtoSchemaBuilder アノテーションへのアプリケーションの移行
以前のバージョンの DataGrid は、ProtoStream API の MessageMarshaller インターフェイスを使用してマーシャリングを設定します。
MessageMarshaller API と ProtoSchemaBuilder アノテーションはどちらも、ProtoStream4.3.4 に対応する DataGrid 8.1.1 で非推奨になりました。
MessageMarshaller インターフェイスの使用には、以下のいずれかが含まれます。
- Protobuf スキーマを手動で作成します。
-
ProtoSchemaBuilderアノテーションを Java クラスに追加してから、Protobuf スキーマを生成します。
ただし、ProtoStream マーシャリングを設定するためのこれらの手法は、 Data Grid 8.1.1 以降で使用可能な AutoProtoSchemaBuilder アノテーションほど効率的で信頼性が高くありません。AutoProtoSchemaBuilder アノテーションを Java クラスに追加し、Protobuf スキーマと関連するマーシャラーを含む SerializationContextInitializer 実装を生成するだけです。
Red Hat は、AutoProtoSchemaBuilder アノテーションの使用を開始して、ProtoStream マーシャラーから最良の結果を取得することをお勧めします。
次のコード例は、アプリケーションを MessageMarshaller API から AutoProtoSchemaBuilder アノテーションに移行する方法を示しています。
5.2.1. 基本的な MessageMarshaller の実装 リンクのコピーリンクがクリップボードにコピーされました!
この例には、デフォルト以外のタイプを使用するいくつかのフィールドが含まれています。コードジェネレーターはデフォルトで int 型を使用するため、text フィールドの順序は異なり、fixed32 フィールドは生成された Protobuf スキーマタイプと競合します。
SimpleEntry.java
SimpleEntryMarshaller.java
結果の Protobuf スキーマ
AutoProtoSchemaBuilder アノテーションに移行
SimpleEntry.java
SimpleEntryInitializer.java
重要な所見
-
Field 2 は、以前のバージョンの ProtoStream マーシャラーがチェックしなかった
intとして定義されています。 Java
intフィールドは null 許容ではないため、ProtoStream プロセッサーは失敗します。
Javaintフィールドは、requiredまたはdefaultValueで初期化する必要があります。Java アプリケーションの観点からは、
intフィールドは 0 で初期化されるため、put 操作で設定されるため、影響を与えることなくdefaultValueを使用できます。requiredへの変更は、常に存在する場合、保存されたデータの観点からは問題ではありませんが、さまざまなクライアントで問題が発生する可能性があります。-
互換性を確立するため、Field 3 は、
Type.FIXED32に明示的に設定する必要があります。 - テキストコレクションは、結果の Protobuf スキーマに対して正しい順序で設定する必要があります。
Protobuf スキーマのテキストコレクションの順序は、移行の前後で同じである必要があります。同様に、移行中に fixed32 タイプを設定する必要があります。
そうでない場合、クライアントアプリケーションは次の例外を出力し、起動に失敗する可能性があります。
Exception ( ISPN004034: Unable to unmarshall bytes )
Exception ( ISPN004034: Unable to unmarshall bytes )
また、キャッシュされたデータに不完全または不正確な結果が表示される場合もあります。
5.2.2. カスタムタイプを使用した MessageMarshaller の実装 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、ProtoStream がネイティブに処理しないフィールドを含む MessageMarshaller 実装の移行例を示します。
次の例では BigInteger クラスを使用していますが、データグリッドアダプターやカスタムクラスを含め、すべてのクラスに適用されます。
BigInteger クラスは不変であるため、引数のないコンストラクターはありません。
CustomTypeEntry.java
CustomTypeEntryMarshaller.java
CustomTypeEntry.proto
アダプタークラスを使用して移行されたコード
ProtoAdapter アノテーションを使用して、MessageMarshaller 実装で作成した Protobuf スキーマと互換性のある Protobuf スキーマを生成する方法で CustomType クラスをマーシャリングできます。
このアプローチでは、次のことができます。
-
CustomTypeEntryクラスに注釈を追加してはなりません。 -
@ProtoAdapterアノテーションを使用して Protobuf スキーマとマーシャラーの生成方法を制御するCustomTypeEntryAdapterクラスを作成します。 @AutoProtoSchemaBuilderアノテーションとともにCustomTypeEntryAdapterクラスを含めます。注記AutoProtoSchemaBuilderアノテーションはCustomTypeEntryクラスを参照しないため、そのクラスに含まれるアノテーションはすべて無視されます。
次の例が示す CustomTypeEntry クラスの ProtoStream アノテーションを含む CustomTypeEntryAdapter クラス:
CustomTypeEntryAdapter.java
次の例が示す CustomTypeEntryAdapter クラスを参照する AutoProtoSchemaBuilder アノテーションと t もに SerializationContextInitializer を示しています。
CustomTypeEntryInitializer.java
アダプタークラスなしで移行されたコード
アダプタークラスを作成する代わりに、ProtoStream アノテーションを CustomTypeEntry クラスに直接追加できます。
この例では、生成された Protobuf スキーマは、BigInteger が別個のメッセージであるため、MessageMarshaller インターフェイスを介して追加されたキャッシュ内のデータと互換性がありません。アダプターフィールドに同じ文字列が書き込まれていても、データのマーシャリングを解除することはできません。
次の例が示す直接 ProtoStream アノテーションを含む CustomTypeEntry クラス:
CustomTypeEntry.java
以下の例は、CustomTypeEntry および BigIntegerAdapter クラスを参照する AutoProtoSchemaBuilder アノテーションと共に SerializationContextInitializer を示しています。
CustomTypeEntryInitializer.java
前述の SerializationContextInitializer 実装から Protobuf スキーマを生成すると、以下の Protobuf スキーマになります。
CustomTypeEntry.proto