コーデック

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: トランスで使用

  • MessageCodecCodecMessageConverter で使用

フレームワークは、いくつかのカスタムシリアライザーを提供します。

  • FileSerializer

  • MessageHeadersSerializer

  • MutableMessageHeadersSerializer

最初のものは、FileKryoRegistrar で初期化することにより、PojoCodec で使用できます。2 番目と 3 番目は MessageCodec で使用され、MessageKryoRegistrar で初期化されます。

Kryo のカスタマイズ

デフォルトでは、Kryo は未知の Java 型を FieldSerializer に委譲します。Kryo は、StringCollectionMap とともに、各プリミティブ型のデフォルトのシリアライザーも登録します。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 インターフェースは KryoInputOutput を公開します。これにより、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 以外の直列化ライブラリをラップすることもできます。

@DefaultSerializer アノテーションの使用

Kryo は、ここで説明するように、@DefaultSerializer アノテーションも提供します。

@DefaultSerializer(SomeClassSerializer.class)
public class SomeClass {
       // ...
}

ドメインオブジェクトへの write アクセス権を持っている場合、これはカスタムシリアライザーを指定するより簡単なメソッドかもしれません。これはクラスに ID を登録しないことに注意してください。