From cc6b1bb4113d7b021dc9acda70f9dadae8b875e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Fri, 31 Jan 2025 16:24:36 +0100 Subject: [PATCH] Improve JSON serialization and deserialization * Use JsonContent.Create() for requests in order to avoid the intermediate string serialization. * Use ReadFromJsonAsync() for responses in order to avoid the intermediate string serialization. Also update target framework from .NET 6 (unsupported) to .NET 8 (current LTS). --- .../Snowflake.Client.Benchmarks.csproj | 2 +- .../Snowflake.Client.Tests.csproj | 2 +- Snowflake.Client/RequestBuilder.cs | 32 ++++++++----------- Snowflake.Client/RestClient.cs | 10 ++---- Snowflake.Client/Snowflake.Client.csproj | 5 +-- 5 files changed, 20 insertions(+), 31 deletions(-) diff --git a/Snowflake.Client.Benchmarks/Snowflake.Client.Benchmarks.csproj b/Snowflake.Client.Benchmarks/Snowflake.Client.Benchmarks.csproj index 3fc6739..4240943 100644 --- a/Snowflake.Client.Benchmarks/Snowflake.Client.Benchmarks.csproj +++ b/Snowflake.Client.Benchmarks/Snowflake.Client.Benchmarks.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 enable diff --git a/Snowflake.Client.Tests/Snowflake.Client.Tests.csproj b/Snowflake.Client.Tests/Snowflake.Client.Tests.csproj index e1ce1f6..aa57594 100644 --- a/Snowflake.Client.Tests/Snowflake.Client.Tests.csproj +++ b/Snowflake.Client.Tests/Snowflake.Client.Tests.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 false Copyright (c) 2020-2021 Ilya Bystrov diff --git a/Snowflake.Client/RequestBuilder.cs b/Snowflake.Client/RequestBuilder.cs index 04fff78..9c0244a 100644 --- a/Snowflake.Client/RequestBuilder.cs +++ b/Snowflake.Client/RequestBuilder.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; -using System.Text; +using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Serialization; using System.Web; @@ -24,17 +24,10 @@ internal RequestBuilder(UrlInfo urlInfo) { _urlInfo = urlInfo; -#if NETSTANDARD - _jsonSerializerOptions = new JsonSerializerOptions() - { - IgnoreNullValues = true - }; -#else _jsonSerializerOptions = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; -#endif _clientInfo = new ClientAppInfo(); } @@ -66,8 +59,7 @@ internal HttpRequestMessage BuildLoginRequest(AuthInfo authInfo, SessionInfo ses }; var requestBody = new LoginRequest() { Data = data }; - var jsonBody = JsonSerializer.Serialize(requestBody, _jsonSerializerOptions); - var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, jsonBody); + var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, requestBody); return request; } @@ -80,8 +72,7 @@ internal HttpRequestMessage BuildCancelQueryRequest(string requestId) RequestId = requestId }; - var jsonBody = JsonSerializer.Serialize(requestBody, _jsonSerializerOptions); - var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, jsonBody); + var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, requestBody); return request; } @@ -95,8 +86,7 @@ internal HttpRequestMessage BuildRenewSessionRequest() RequestType = "RENEW" }; - var jsonBody = JsonSerializer.Serialize(requestBody, _jsonSerializerOptions); - var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, jsonBody, true); + var request = BuildJsonRequestMessage(requestUri, HttpMethod.Post, requestBody, true); return request; } @@ -112,8 +102,7 @@ internal HttpRequestMessage BuildQueryRequest(string sql, object sqlParams, bool Bindings = ParameterBinder.BuildParameterBindings(sqlParams) }; - var jsonBody = JsonSerializer.Serialize(requestBody, _jsonSerializerOptions); - var request = BuildJsonRequestMessage(queryUri, HttpMethod.Post, jsonBody); + var request = BuildJsonRequestMessage(queryUri, HttpMethod.Post, requestBody); return request; } @@ -212,15 +201,20 @@ internal Uri BuildUri(string basePath, Dictionary queryParams = return uriBuilder.Uri; } - private HttpRequestMessage BuildJsonRequestMessage(Uri uri, HttpMethod method, string jsonBody = null, bool useMasterToken = false) + private HttpRequestMessage BuildJsonRequestMessage(Uri uri, HttpMethod method, bool useMasterToken = false) + { + return BuildJsonRequestMessage(uri, method, null, useMasterToken); + } + + private HttpRequestMessage BuildJsonRequestMessage(Uri uri, HttpMethod method, T requestBody = default, bool useMasterToken = false) { var request = new HttpRequestMessage(); request.Method = method; request.RequestUri = uri; - if (jsonBody != null && method != HttpMethod.Get) + if (requestBody != null && method != HttpMethod.Get) { - request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json"); + request.Content = JsonContent.Create(requestBody, options: _jsonSerializerOptions); } if (_sessionToken != null) diff --git a/Snowflake.Client/RestClient.cs b/Snowflake.Client/RestClient.cs index 0f03524..751cbdc 100644 --- a/Snowflake.Client/RestClient.cs +++ b/Snowflake.Client/RestClient.cs @@ -1,6 +1,7 @@ using System; using System.Net; using System.Net.Http; +using System.Net.Http.Json; using System.Security.Authentication; using System.Text.Json; using System.Threading; @@ -44,14 +45,7 @@ internal async Task SendAsync(HttpRequestMessage request, CancellationToke request.Headers.ExpectContinue = false; var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, ct).ConfigureAwait(false); response.EnsureSuccessStatusCode(); - -#if NETSTANDARD - var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); -#else - var json = await response.Content.ReadAsStringAsync(ct).ConfigureAwait(false); -#endif - - return JsonSerializer.Deserialize(json, _jsonSerializerOptions); + return await response.Content.ReadFromJsonAsync(_jsonSerializerOptions, ct).ConfigureAwait(false); } } } \ No newline at end of file diff --git a/Snowflake.Client/Snowflake.Client.csproj b/Snowflake.Client/Snowflake.Client.csproj index 2e53aa8..059c7dd 100644 --- a/Snowflake.Client/Snowflake.Client.csproj +++ b/Snowflake.Client/Snowflake.Client.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net6.0 + netstandard2.0;net8.0 true 0.4.6 fixer_m @@ -18,7 +18,8 @@ Provides straightforward and efficient way to execute SQL queries in Snowflake a - + +