

# Lambda Java 関数のシリアル化をカスタマイズ
<a name="java-custom-serialization"></a>

Lambda [Java マネージドランタイム](lambda-java.md#java-runtimes)は、JSON イベントのカスタムシリアル化をサポートしています。カスタムシリアル化はコードを簡素化し、パフォーマンスを向上させる可能性があります。

**Topics**
+ [カスタムシリアル化を使用する場合](#custom-serialization-use-cases)
+ [カスタムシリアル化の実装](#implement-custom-serialization)
+ [カスタムシリアル化のテスト](#test-custom-serialization)

## カスタムシリアル化を使用する場合
<a name="custom-serialization-use-cases"></a>

Lambda 関数を呼び出すと、入力イベントデータを Java オブジェクトに逆シリアル化し、関数からの出力を関数のレスポンスとして返すことができる形式にシリアル化する必要があります。Lambda Java マネージドランタイムは、Amazon API Gateway や Amazon Simple Queue Service (Amazon SQS) など、さまざまな AWS サービスからのイベントペイロードを処理するのに最適なデフォルトのシリアル化および逆シリアル化機能を提供します。関数でこれらのサービス統合イベントを使用するには、[aws-java-lambda-events](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-events) の依存関係をプロジェクトに追加します。この AWS ライブラリには、これらのサービス統合イベントを表す Java オブジェクトが含まれています。

また、独自のオブジェクトを使用して、Lambda 関数に渡すイベント JSON を表すこともできます。マネージドランタイムは、JSON をデフォルトの動作でオブジェクトの新しいインスタンスにシリアル化しようとします。デフォルトのシリアライザーにユースケースに必要な動作がない場合は、カスタムシリアル化を使用します。

例えば、関数ハンドラーが、以下の構造で `Vehicle` クラスを入力として想定するとします:

```
public class Vehicle {
    private String vehicleType;
    private long vehicleId;
}
```

ただし、JSON イベントペイロードは以下のようになります:

```
{
    "vehicle-type": "car",
    "vehicleID": 123
}
```

このシナリオでは、マネージドランタイムのデフォルトのシリアル化により、JSON プロパティ名がキャメルケースの Java クラスプロパティ名 (`vehicleType`、`vehicleId`) と一致することが想定されます。JSON イベントのプロパティ名はキャメルケース (`vehicle-type`、`vehicleID`) にないため、カスタムシリアル化を使用する必要があります。

## カスタムシリアル化の実装
<a name="implement-custom-serialization"></a>

[サービスプロバイダーインターフェイス](https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html)を使用して、マネージドランタイムのデフォルトのシリアル化ロジックではなく、選択したシリアライザーをロードします。標準 `RequestHandler` インターフェイスを使用して、JSON イベントペイロードを Java オブジェクトに直接シリアル化できます。

**Lambda Java 関数でカスタムシリアル化を使用するには**

1. [aws-lambda-java-core](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core) ライブラリを依存関係として追加します。このライブラリには、[CustomPojoSerializer](https://github.com/aws/aws-lambda-java-libs/blob/main/aws-lambda-java-core/src/main/java/com/amazonaws/services/lambda/runtime/CustomPojoSerializer.java) インターフェイスと、Lambda で Java を操作するための他のインターフェイス定義が含まれています。

1. プロジェクトの `src/main/resources/META-INF/services/` ディレクトリに `com.amazonaws.services.lambda.runtime.CustomPojoSerializer` という名前のファイルを作成します。

1. このファイルで、`CustomPojoSerializer` インターフェイスを実装する必要があるカスタムシリアライザー実装の完全修飾名を指定します。例:

   ```
   com.mycompany.vehicles.CustomLambdaSerialzer
   ```

1. `CustomPojoSerializer` インターフェイスを実装して、カスタムシリアル化ロジックを提供します。

1. Lambda 関数で標準 `RequestHandler` インターフェイスを使用します。マネージドランタイムは、カスタムシリアライザーを使用します。

fastJson 、Gson、Moshi、jackson-jr などの一般的なライブラリを使用してカスタムシリアル化を実装するその他の例については、「AWS GitHub リポジトリ」の「[custom-serialization](https://github.com/aws/aws-lambda-java-libs/tree/main/samples/custom-serialization)」のサンプルを参照してください。

## カスタムシリアル化のテスト
<a name="test-custom-serialization"></a>

関数をテストして、シリアル化ロジックと逆シリアル化ロジックが期待どおりに動作していることを確認します。AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) を使用して、Lambda ペイロードの呼び出しをエミュレートできます。これにより、カスタムシリアライザーを導入する際に、関数ですばやくテストして反復処理できます。

1. 関数を呼び出す JSON イベントペイロードを使用してファイルを作成し、AWS SAM CLI を呼び出します。

1. [sam ローカル呼び出し](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html )コマンドを実行して、関数をローカルで呼び出します。例:

   ```
   sam local invoke -e src/test/resources/event.json
   ```

詳細については、「[AWS SAM を使用して Lambda 関数をローカルで呼び出し](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html)」を参照してください。