EC2で実行されている既存の.NETCore3.0ワーカーサービスをAWSLambdaに移行する一環として、 SQSEvent
などのLambda関数へのペイロードの逆シリアル化を処理するカスタムILambdaSerializer
実装をコード化しました。 SQSEvent
。
これは比較的簡単に実行できますが、System.Text.Jsonのシリアライザー実装がLambda SDKに組み込まれていると、さまざまな関数コードベース間でコピーアンドペーストする必要がなくなります。
今日の現状の欠点の1つは、イベントが一貫したPascalCaseとcamelCaseの命名を使用していないため、シリアライザーオプションでPropertyNameCaseInsensitive
をtrue
に設定する必要があることです。パフォーマンスのペナルティが発生します(ペナルティの量を表す数量詞はありません)。 SQSEvent
の場合、$# EventSourceArn
にマップされないため、 eventSourceARN
がトリップすると思います。
これは、モデルのプロパティに[JsonPropertyName("...")]
属性アノテーションを追加することで、イベントライブラリで簡単に修正できると思います。
System.Text.Json.JsonSerializer
の非同期サポートを活用し、 Stream
を直接消費する非同期メソッドがインターフェイスにあれば、さらにメリットが得られると思いますが、これは、現在のインターフェース。
以下は私たちが使用しているコードです。 さらなる最適化の恩恵を受けるかもしれませんが、現在のところ、それは私たちにとってうまく機能しています:
using System.IO;
using System.Text.Json;
using Amazon.Lambda.Core;
namespace MyLambdaFunction
{
public sealed class SystemTextJsonLambdaSerializer : ILambdaSerializer
{
private readonly JsonSerializerOptions _options;
public SystemTextJsonLambdaSerializer()
{
// SQSEvent does not use a consistent camel/Pascal case naming convention,
// so as we cannot annotate with attributes, the options need to be case
// insensitive to be tolerant for things to work properly when deserializing.
_options = new JsonSerializerOptions()
{
IgnoreNullValues = true,
PropertyNameCaseInsensitive = true,
};
}
public T Deserialize<T>(Stream requestStream)
{
using var copy = new MemoryStream();
requestStream.CopyTo(copy);
byte[] utf8Json = copy.ToArray();
return JsonSerializer.Deserialize<T>(utf8Json, _options);
}
public void Serialize<T>(T response, Stream responseStream)
{
using var writer = new Utf8JsonWriter(responseStream);
JsonSerializer.Serialize(writer, response, _options);
}
}
}
/ cc @normj
@martincostelloに感謝します。 これをLambda.NETリポジトリに移動します。
注意点として、 APIGatewayでは機能しない@martincostelloです。
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
これも追加する必要があります。そうしないと、プロパティのパスカルケースが原因で応答が不正であると見なされます。
役立つ@phillip-haydonに感謝します。
私はsystem.text.jsonブランチでこれの公式サポートに取り組んでいます。
新しいシリアライザーがNewtonsoftのものと同じように機能することを確認するために、既存のイベントテストを進めています。 まだ非常に進行中の作業ですが、お気軽にご覧になり、フィードバックをお寄せください。
このPRは、Lambdaカスタムランタイム機能を使用して.NETCore3.1を現在試しているユーザー向けのNuGetパッケージのプレビュービルドへのリンクを使用して作成されています。 https://github.com/aws/aws-lambda-dotnet/pull/568。
この問題を解決し、PRを使用してこの機能を追跡します。
最も参考になるコメント
@martincostelloに感謝します。 これをLambda.NETリポジトリに移動します。