コーデック
Spring Integration のバージョン 4.2 は、Codec
抽象化を導入しました。コーデックは、byte[]
との間でオブジェクトをエンコードおよびデコードします。Java 直列化の代替手段を提供します。1 つの利点は、通常、オブジェクトが Serializable
を実装する必要がないことです。Kryo [GitHub] (英語) を使用して直列化する実装を 1 つ提供していますが、次のコンポーネントで使用する独自の実装を提供できます。
EncodingPayloadTransformer
DecodingTransformer
CodecMessageConverter
EncodingPayloadTransformer
このトランスフォーマーは、コーデックを使用してペイロードを byte[]
にエンコードします。メッセージヘッダーには影響しません。
詳細については、Javadoc を参照してください。
DecodingTransformer
このトランスフォーマーは、コーデックを使用して byte[]
をデコードします。オブジェクトのデコード先の Class
(または Class
に解決される式)で構成する必要があります。結果のオブジェクトが Message<?>
の場合、受信ヘッダーは保持されません。
詳細については、Javadoc を参照してください。
CodecMessageConverter
特定のエンドポイント(TCP や Redis など)には、メッセージヘッダーの概念がありません。それらは MessageConverter
の使用をサポートし、CodecMessageConverter
は、送信のためにメッセージを byte[]
との間で変換するために使用できます。
詳細については、Javadoc を参照してください。
Kryo
現在、これは Codec
の唯一の実装であり、2 種類の Codec
を提供します。
PojoCodec
: トランスで使用MessageCodec
:CodecMessageConverter
で使用
フレームワークは、いくつかのカスタムシリアライザーを提供します。
FileSerializer
MessageHeadersSerializer
MutableMessageHeadersSerializer
最初のものは、FileKryoRegistrar
で初期化することにより、PojoCodec
で使用できます。2 番目と 3 番目は MessageCodec
で使用され、MessageKryoRegistrar
で初期化されます。
Kryo のカスタマイズ
デフォルトでは、Kryo は未知の Java 型を FieldSerializer
に委譲します。Kryo は、String
、Collection
、Map
とともに、各プリミティブ型のデフォルトのシリアライザーも登録します。FieldSerializer
は、反射を使用してオブジェクトグラフをナビゲートします。より効率的なアプローチは、オブジェクトの構造を認識し、選択したプリミティブフィールドを直接直列化できるカスタムシリアライザーを実装することです。次の例は、そのようなシリアライザーを示しています。
public class AddressSerializer extends Serializer<Address> {
@Override
public void write(Kryo kryo, Output output, Address address) {
output.writeString(address.getStreet());
output.writeString(address.getCity());
output.writeString(address.getCountry());
}
@Override
public Address read(Kryo kryo, Input input, Class<Address> type) {
return new Address(input.readString(), input.readString(), input.readString());
}
}
Serializer
インターフェースは Kryo
、Input
、Output
を公開します。これにより、Kryo ドキュメント [GitHub] (英語) に従って、含まれるフィールドやその他の内部設定を完全に制御できます。
カスタムシリアライザーを登録するときは、登録 ID が必要です。登録 ID は任意です。ただし、この場合、分散アプリケーション全体の各 Kryo インスタンスは同じ ID を使用する必要があるため、ID を明示的に定義する必要があります。Kryo は小さな正の整数を推奨し、いくつかの ID(値 <10)を予約します。Spring Integration は現在、40, 41,, 42 を使用するようにデフォルト設定されています(前述のファイルおよびメッセージヘッダーシリアライザー用)。フレームワークを拡張できるように、60 から開始することをお勧めします。前述のレジストラを構成することにより、これらのフレームワークのデフォルトをオーバーライドできます。 |
カスタム Kryo シリアライザーの使用
カスタマイズにはネイティブ API を使用する必要があるため、カスタムの直列化が必要な場合は、Kryo [GitHub] (英語) のドキュメントを参照してください。例については、org.springframework.integration.codec.kryo.MessageCodec
実装を参照してください。
KryoSerializable の実装
ドメインオブジェクトのソースコードへの write
アクセス権がある場合は、ここで説明されているように KryoSerializable
を実装できます。この場合、クラスは直列化メソッド自体を提供し、それ以上の構成は必要ありません。ただし、ベンチマークは、これがカスタムシリアライザーを明示的に登録するほど効率的ではないことを示しています。次の例は、カスタム Kryo シリアライザーを示しています。
public class Address implements KryoSerializable {
@Override
public void write(Kryo kryo, Output output) {
output.writeString(this.street);
output.writeString(this.city);
output.writeString(this.country);
}
@Override
public void read(Kryo kryo, Input input) {
this.street = input.readString();
this.city = input.readString();
this.country = input.readString();
}
}
この手法を使用して、Kryo 以外の直列化ライブラリをラップすることもできます。