Aws-lambda-dotnet: System.Text.Json AWS Lambda SDKのサポート?

作成日 2019年11月14日  ·  4コメント  ·  ソース: aws/aws-lambda-dotnet

EC2で実行されている既存の.NETCore3.0ワーカーサービスをAWSLambdaに移行する一環として、 SQSEventなどのLambda関数へのペイロードの逆シリアル化を処理するカスタムILambdaSerializer実装をコード化しました。 SQSEvent

これは比較的簡単に実行できますが、System.Text.Jsonのシリアライザー実装がLambda SDKに組み込まれていると、さまざまな関数コードベース間でコピーアンドペーストする必要がなくなります。

今日の現状の欠点の1つは、イベントが一貫したPascalCaseとcamelCaseの命名を使用していないため、シリアライザーオプションでPropertyNameCaseInsensitivetrueに設定する必要があることです。パフォーマンスのペナルティが発生します(ペナルティの量を表す数量詞はありません)。 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

feature-request

最も参考になるコメント

@martincostelloに感謝します。 これをLambda.NETリポジトリに移動します。

全てのコメント4件

@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を使用してこの機能を追跡します。

このページは役に立ちましたか?
0 / 5 - 0 評価