自定义 Lambda Java 函数的序列化 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

自定义 Lambda Java 函数的序列化

Lambda Java 托管式运行时支持 JSON 事件的自定义序列化。自定义序列化可以简化代码并有可能提高性能。

何时使用自定义序列化

调用 Lambda 函数时,需要将输入事件数据反序列化为 Java 对象,并且需要将函数的输出序列化回可以作为函数响应返回的格式。Lambda Java 托管式运行时提供默认的序列化和反序列化功能,非常适合处理来自各种 Amazon 服务的事件有效载荷,例如 Amazon API Gateway 和 Amazon Simple Queue Service(Amazon SQS)。要在函数中使用这些服务集成事件,请向项目中添加 aws-java-lambda-events 依赖项。此 Amazon 库包含表示这些服务集成事件的 Java 对象。

您也可以使用自己的对象来表示传递给 Lambda 函数的事件 JSON。托管式运行时会尝试将 JSON 序列化为对象的新实例,且该新实例具有其默认行为。如果默认序列化器无用例所需的行为,请使用自定义序列化。

例如,假设函数处理程序需要 Vehicle 类作为输入,并且此类具有以下结构:

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

但是,JSON 事件有效载荷如下所示:

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

在这种情况下,托管式运行时中的默认序列化需要 JSON 属性名称与驼峰式大小写的 Java 类属性名称(vehicleTypevehicleId)相匹配。JSON 事件中的属性名称并非为驼峰式大小写(vehicle-typevehicleID),因此必须使用自定义序列化。

实现自定义序列化

使用服务提供程序接口加载您选择的序列化器,而非托管式运行时的默认序列化逻辑。您可以使用标准 RequestHandler 接口将 JSON 事件有效载荷直接序列化为 Java 对象。

要在 Lambda Java 函数中使用自定义序列化
  1. 添加 aws-lambda-java-core(作为依赖项)。此库包括 CustomPojoSerializer 接口,以及其他用于在 Lambda 中使用 Java 的接口定义。

  2. 在项目的 src/main/META-INF/services/ 目录中创建名为 com.amazonaws.services.lambda.runtime.CustomPojoSerializer 的文件。

  3. 在此文件中,指定自定义序列化器实现(该实现必须实现 CustomPojoSerializer 接口)的完全限定名称。例如:

    com.mycompany.vehicles.CustomLambdaSerialzer
  4. 实现 CustomPojoSerializer 接口以提供自定义序列化逻辑。

  5. 在 Lambda 函数中使用标准 RequestHandler 接口。托管式运行时将使用自定义序列化程序。

有关如何使用 fastJson、Gson、Moshi 和 jackson-jr 等常用库实现自定义序列化的更多示例,请参阅《Amazon GitHub repository》中的 custom-serialization 示例。

测试自定义序列化

测试函数,确保序列化和反序列化逻辑按预期运行。您可以使用 Amazon Serverless Application Model 命令行接口(Amazon SAMCLI)来模拟 Lambda 有效载荷的调用。在引入自定义序列化器时,此举可以帮助您快速测试和迭代函数。

  1. 使用要调用函数的 JSON 事件有效载荷创建文件,然后调用 Amazon SAM CLI。

  2. 运行 sam local invoke 命令,在本地调用函数。例如:

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

有关更多信息,请参阅 Locally invoke Lambda functions with Amazon SAM