Skip to content

Commit f1c47e5

Browse files
committed
Add overload taking multiple IJsonTypeResolvers and ensure we use JsonTypeInfoResolver.Combine
1 parent 6143e8b commit f1c47e5

File tree

4 files changed

+40
-23
lines changed

4 files changed

+40
-23
lines changed

src/Elastic.Clients.Elasticsearch/_Shared/Core/Configuration/ElasticsearchClientSettings.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
using System.Linq.Expressions;
1010
using System.Reflection;
1111
using System.Runtime.InteropServices;
12-
12+
using System.Text.Json.Serialization.Metadata;
1313
using Elastic.Clients.Elasticsearch.Esql;
1414
using Elastic.Clients.Elasticsearch.Requests;
1515
using Elastic.Clients.Elasticsearch.Serialization;
@@ -86,10 +86,12 @@ public ElasticsearchClientSettings(InMemoryRequestInvoker inMemoryTransportClien
8686
public ElasticsearchClientSettings(
8787
NodePool nodePool,
8888
IRequestInvoker requestInvoker,
89-
SourceSerializerFactory sourceSerializer,
90-
IPropertyMappingProvider propertyMappingProvider) : base(nodePool, requestInvoker, sourceSerializer, propertyMappingProvider)
89+
SourceSerializerFactory? sourceSerializer,
90+
IPropertyMappingProvider? propertyMappingProvider
91+
) : base(nodePool, requestInvoker, sourceSerializer, propertyMappingProvider)
9192
{
9293
}
94+
9395
}
9496

9597
/// <inheritdoc cref="IElasticsearchClientSettings" />
@@ -121,21 +123,23 @@ public abstract class ElasticsearchClientSettingsBase<TConnectionSettings> :
121123

122124
protected ElasticsearchClientSettingsBase(
123125
NodePool nodePool,
124-
IRequestInvoker requestInvoker,
126+
IRequestInvoker? requestInvoker,
125127
ElasticsearchClientSettings.SourceSerializerFactory? sourceSerializerFactory,
126-
IPropertyMappingProvider propertyMappingProvider)
128+
IPropertyMappingProvider? propertyMappingProvider
129+
)
127130
: base(nodePool, requestInvoker, null, ElasticsearchClientProductRegistration.DefaultForElasticsearchClientsElasticsearch)
128131
{
129132
var requestResponseSerializer = new DefaultRequestResponseSerializer(this);
130133
var sourceSerializer = new DefaultSourceSerializer(this);
131134

132135
UseThisRequestResponseSerializer = requestResponseSerializer;
133136

137+
_propertyMappingProvider = propertyMappingProvider ?? new DefaultPropertyMappingProvider();
134138
_sourceSerializer = sourceSerializerFactory?.Invoke(sourceSerializer, this) ?? sourceSerializer;
135-
_propertyMappingProvider = propertyMappingProvider ?? sourceSerializer as IPropertyMappingProvider ?? new DefaultPropertyMappingProvider();
136139
_defaultFieldNameInferrer = _sourceSerializer.TryGetJsonSerializerOptions(out var options)
137140
? p => options.PropertyNamingPolicy?.ConvertName(p) ?? p
138141
: p => p.ToCamelCase();
142+
139143
_defaultIndices = new FluentDictionary<Type, string>();
140144
_defaultRelationNames = new FluentDictionary<Type, string>();
141145
_inferrer = new Inferrer(this);
@@ -394,9 +398,12 @@ public abstract class ConnectionConfigurationBase<TConnectionConfiguration> :
394398
{
395399
private bool _includeServerStackTraceOnError;
396400

397-
protected ConnectionConfigurationBase(NodePool nodePool, IRequestInvoker requestInvoker,
401+
protected ConnectionConfigurationBase(
402+
NodePool nodePool,
403+
IRequestInvoker? requestInvoker,
398404
Serializer? serializer,
399-
ProductRegistration registration = null)
405+
ProductRegistration? registration = null
406+
)
400407
: base(nodePool, requestInvoker, serializer, registration ?? new ElasticsearchProductRegistration(typeof(ElasticsearchClient)))
401408
{
402409
UserAgent(ConnectionConfiguration.DefaultUserAgent);

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultSourceSerializer.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Text.Json.Serialization.Metadata;
1111

1212
using Elastic.Transport;
13+
using Elastic.Transport.Products.Elasticsearch;
1314

1415
namespace Elastic.Clients.Elasticsearch.Serialization;
1516

@@ -37,7 +38,12 @@ public DefaultSourceSerializer(IElasticsearchClientSettings settings, Action<Jso
3738
/// <param name="typeInfoResolver">A custom <see cref="IJsonTypeInfoResolver"/> to use.</param>
3839
/// <param name="configureOptions">An optional <see cref="Action{T}"/> to customize the default <see cref="JsonSerializerOptions"/>.</param>
3940
public DefaultSourceSerializer(IElasticsearchClientSettings settings, IJsonTypeInfoResolver typeInfoResolver, Action<JsonSerializerOptions>? configureOptions = null) :
40-
base(new DefaultSourceSerializerOptionsProvider(settings, typeInfoResolver, configureOptions))
41+
base(new DefaultSourceSerializerOptionsProvider(settings, [typeInfoResolver], configureOptions))
42+
{
43+
}
44+
45+
public DefaultSourceSerializer(IElasticsearchClientSettings settings, IJsonTypeInfoResolver[] typeInfoResolvers, Action<JsonSerializerOptions>? configureOptions = null) :
46+
base(new DefaultSourceSerializerOptionsProvider(settings, typeInfoResolvers, configureOptions))
4147
{
4248
}
4349
}
@@ -68,11 +74,11 @@ public DefaultSourceSerializerOptionsProvider(IElasticsearchClientSettings setti
6874
/// <param name="settings">The <see cref="IElasticsearchClientSettings"/> instance to which this serializer options will be linked.</param>
6975
/// <param name="typeInfoResolver">A custom <see cref="IJsonTypeInfoResolver"/> to use.</param>
7076
/// <param name="configureOptions">An optional <see cref="Action{T}"/> to customize the default <see cref="JsonSerializerOptions"/>.</param>
71-
public DefaultSourceSerializerOptionsProvider(IElasticsearchClientSettings settings, IJsonTypeInfoResolver typeInfoResolver, Action<JsonSerializerOptions>? configureOptions = null) :
77+
public DefaultSourceSerializerOptionsProvider(IElasticsearchClientSettings settings, IJsonTypeInfoResolver[] typeInfoResolvers, Action<JsonSerializerOptions>? configureOptions = null) :
7278
base(
7379
CreateDefaultBuiltInConverters(settings),
7480
null,
75-
options => MutateOptions(options, typeInfoResolver ?? throw new ArgumentNullException(nameof(typeInfoResolver)), configureOptions)
81+
options => MutateOptions(options, typeInfoResolvers, configureOptions)
7682
)
7783
{
7884
}
@@ -94,10 +100,13 @@ private static IReadOnlyCollection<JsonConverter> CreateDefaultBuiltInConverters
94100

95101
[UnconditionalSuppressMessage("AOT", "IL3050:Calling members annotated with 'RequiresDynamicCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
96102
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute'", Justification = "Always using explicit TypeInfoResolver")]
97-
private static void MutateOptions(JsonSerializerOptions options, IJsonTypeInfoResolver? typeInfoResolver, Action<JsonSerializerOptions>? configureOptions)
103+
private static void MutateOptions(JsonSerializerOptions options, IJsonTypeInfoResolver[]? typeInfoResolvers, Action<JsonSerializerOptions>? configureOptions)
98104
{
99-
options.TypeInfoResolver = typeInfoResolver ?? new DefaultJsonTypeInfoResolver();
105+
var resolvers = typeInfoResolvers ?? [];
100106

107+
options.TypeInfoResolver = JsonTypeInfoResolver.Combine(
108+
[new DefaultJsonTypeInfoResolver(), ElasticsearchTransportSerializerContext.Default, .. resolvers]
109+
);
101110
options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
102111
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
103112

src/Playground/Person.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
using System.Text.Json.Serialization;
77
using Elastic.Clients.Elasticsearch;
88
using Playground;
9-
using Elastic.Clients.Elasticsearch.QueryDsl;
109

1110
namespace Playground
1211
{
12+
[JsonSerializable(typeof(Person))]
13+
internal partial class PlaygroundJsonSerializerContext : JsonSerializerContext;
14+
1315
public class Person
1416
{
1517
public int Id { get; set; }
1618

17-
[System.Text.Json.Serialization.JsonPropertyName("id2")]
19+
[JsonPropertyName("id2")]
1820
public Guid SecondaryId { get; set; } = Guid.NewGuid();
1921
public string? FirstName { get; init; }
2022
public string? LastName { get; init; }
@@ -25,16 +27,14 @@ public class Person
2527
public Id Idv3 => "testing";
2628
//public Guid Routing { get; init; } = Guid.NewGuid();
2729

28-
[System.Text.Json.Serialization.JsonIgnore]
30+
[JsonIgnore]
2931
public string? Email { get; init; }
3032

3133
[DataMember(Name = "STEVE")]
3234
[IgnoreDataMember]
3335
public string Data { get; init; } = "NOTHING";
3436

3537
public DateTimeKind Enum { get; init; }
36-
37-
public Query? Q { get; init; }
3838
}
3939

4040
public class PersonV3
@@ -45,5 +45,3 @@ public class PersonV3
4545

4646

4747

48-
[JsonSerializable(typeof(Person))]
49-
internal partial class ExampleJsonSerializerContext : JsonSerializerContext;

src/Playground/Program.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44

55
using System.Diagnostics.CodeAnalysis;
66
using Elastic.Clients.Elasticsearch;
7+
using Elastic.Clients.Elasticsearch.Serialization;
78
using Elastic.Transport;
89
using Elastic.Transport.Extensions;
9-
using static System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes;
10-
1110
using Playground;
1211

13-
var settings = new ElasticsearchClientSettings(new Uri("https://primary.es.europe-west3.gcp.cloud.es.io"))
12+
var pool = new SingleNodePool(new Uri("https://primary.es.europe-west3.gcp.cloud.es.io"));
13+
var settings = new ElasticsearchClientSettings(pool,
14+
sourceSerializer: (_, settings) =>
15+
new DefaultSourceSerializer(settings, [PlaygroundJsonSerializerContext.Default])
16+
)
1417
.Authentication(new BasicAuthentication("elastic", "Oov35Wtxj5DzpZNzYAzFb0KZ"))
1518
.DisableDirectStreaming()
1619
.EnableDebugMode(cd =>

0 commit comments

Comments
 (0)