

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 自訂 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 local invoke](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
   ```

如需詳細資訊，請參閱 [Locally invoke Lambda functions with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-invoke.html)。