From 7a2392c7df941b2ac46184e4128460f8021151ed Mon Sep 17 00:00:00 2001 From: Charles Roddie Date: Sun, 13 Sep 2026 10:08:34 +0100 Subject: [PATCH 1/3] Use System.Text.Json source generation to remove trim/AOT warnings Replaces reflection-based JsonSerializer calls in SqlVector, SqlParameter and HostGuardianServiceEnclaveProvider with a JsonSerializerContext, removing IL2026/IL3050 warnings. Co-Authored-By: Claude Opus 5 (1M context) --- .../SqlClient/SqlClientJsonSerializerContext.cs | 16 ++++++++++++++++ .../src/Microsoft/Data/SqlClient/SqlParameter.cs | 2 +- .../VirtualSecureModeEnclaveProvider.cs | 2 +- .../src/Microsoft/Data/SqlTypes/SqlVector.cs | 3 ++- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs new file mode 100644 index 0000000000..9e53db94dd --- /dev/null +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace Microsoft.Data.SqlClient; + +[JsonSerializable(typeof(float[]))] +[JsonSerializable(typeof(ReadOnlyMemory))] +[JsonSerializable(typeof(List))] +internal sealed partial class SqlClientJsonSerializerContext : JsonSerializerContext +{ +} diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlParameter.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlParameter.cs index f9e342d4c6..b0fc3fd911 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlParameter.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlParameter.cs @@ -2389,7 +2389,7 @@ internal static object CoerceValue(object value, MetaType destinationType, out b { try { - value = ((ISqlVector)new SqlVector(JsonSerializer.Deserialize((string)value))).VectorPayload; + value = ((ISqlVector)new SqlVector(JsonSerializer.Deserialize((string)value, SqlClientJsonSerializerContext.Default.SingleArray))).VectorPayload; } catch (Exception ex) when (ex is ArgumentNullException || ex is JsonException) { diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/VirtualSecureModeEnclaveProvider.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/VirtualSecureModeEnclaveProvider.cs index aa7e17be03..695951f965 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/VirtualSecureModeEnclaveProvider.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/VirtualSecureModeEnclaveProvider.cs @@ -72,7 +72,7 @@ protected override byte[] MakeRequest(string url) using (Stream stream = s_client.GetStreamAsync(url).ConfigureAwait(false).GetAwaiter().GetResult()) { - return JsonSerializer.Deserialize>(stream)?.ToArray(); + return JsonSerializer.Deserialize(stream, SqlClientJsonSerializerContext.Default.ListByte)?.ToArray(); } } catch (Exception e) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlTypes/SqlVector.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlTypes/SqlVector.cs index d87a539c37..ce16e5b445 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlTypes/SqlVector.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlTypes/SqlVector.cs @@ -97,7 +97,8 @@ internal string GetString() { return SQLMessage.NullString(); } - return JsonSerializer.Serialize(Memory); + // GetTypeFieldsOrThrow guarantees T is float. + return JsonSerializer.Serialize((ReadOnlyMemory)(object)Memory, SqlClientJsonSerializerContext.Default.ReadOnlyMemorySingle); } #endregion From 8fbc971adaf3fb6bf0de2834763f8e726b036752 Mon Sep 17 00:00:00 2001 From: Charles Roddie Date: Mon, 28 Sep 2026 17:35:43 +0100 Subject: [PATCH 2/3] Document generated property names on SqlClientJsonSerializerContext Co-Authored-By: Claude Opus 5.5 --- .../Data/SqlClient/SqlClientJsonSerializerContext.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs index 9e53db94dd..6a7f232a4c 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs @@ -8,6 +8,10 @@ namespace Microsoft.Data.SqlClient; +/// +/// Source-generated JSON metadata. Each [JsonSerializable] type gets a property named after its CLR type: +/// float[] → SingleArray, ReadOnlyMemory<float> → ReadOnlyMemorySingle, List<byte> → ListByte. +/// [JsonSerializable(typeof(float[]))] [JsonSerializable(typeof(ReadOnlyMemory))] [JsonSerializable(typeof(List))] From 801e771dd4e80991a7ecbcfcd39a8c05afec6ada Mon Sep 17 00:00:00 2001 From: Charles Roddie Date: Mon, 28 Sep 2026 18:48:04 +0100 Subject: [PATCH 3/3] Use ASCII arrows in SqlClientJsonSerializerContext doc comment Co-Authored-By: Claude Opus 5.5 --- .../Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs index 6a7f232a4c..546595c7aa 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientJsonSerializerContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.Data.SqlClient; /// /// Source-generated JSON metadata. Each [JsonSerializable] type gets a property named after its CLR type: -/// float[] → SingleArray, ReadOnlyMemory<float> → ReadOnlyMemorySingle, List<byte> → ListByte. +/// float[] -> SingleArray, ReadOnlyMemory<float> -> ReadOnlyMemorySingle, List<byte> -> ListByte. /// [JsonSerializable(typeof(float[]))] [JsonSerializable(typeof(ReadOnlyMemory))]