Skip to content

Commit 4e11002

Browse files
committed
#2183 strikes again, causing a null reference when JsonNetSerializer() was being injected, because we use a custom ConnectionSettingsAwareSerializerBase implementation in our tests this was not caught. Also this PR renames our internal json converter from JsonNetSerializer to InternalSerializer, otherwise you would get a confusing error message about using an internal type before actually referencing Nest.JsonNetSerializer
1 parent 3870f59 commit 4e11002

File tree

8 files changed

+59
-48
lines changed

8 files changed

+59
-48
lines changed

src/Nest/CommonAbstractions/ConnectionSettings/ConnectionSettingsBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ IPropertyMappingProvider propertyMappingProvider
8989
)
9090
: base(connectionPool, connection, null)
9191
{
92-
var defaultSerializer = new JsonNetSerializer(this);
92+
var defaultSerializer = new InternalSerializer(this);
9393
this._sourceSerializer = sourceSerializerFactory?.Invoke(defaultSerializer, this) ?? defaultSerializer;
9494
this.UseThisRequestResponseSerializer = defaultSerializer;
9595
this._propertyMappingProvider = propertyMappingProvider ?? new PropertyMappingProvider();

src/Nest/CommonAbstractions/ConnectionSettings/ConnectionSettingsValuesExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Nest
66
{
77
internal static class ConnectionSettingsValuesExtensions
88
{
9-
public static JsonNetSerializer CreateStateful(this IConnectionSettingsValues settings, JsonConverter converter)
9+
public static InternalSerializer CreateStateful(this IConnectionSettingsValues settings, JsonConverter converter)
1010
{
1111
var s = (settings as ConnectionSettings)
1212
?? throw new NullReferenceException($"Stateful serializer expected {nameof(IConnectionSettingsValues)} to be {nameof(ConnectionSettings)}");

src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs renamed to src/Nest/CommonAbstractions/SerializationBehavior/InternalSerializer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
namespace Nest
1111
{
1212

13-
/// <summary> A JSON serializer that uses Json.NET for serialization </summary>
14-
internal class JsonNetSerializer : IElasticsearchSerializer
13+
/// <summary>The built in internal serializer that the high level client NEST uses.</summary>
14+
internal class InternalSerializer : IElasticsearchSerializer
1515
{
1616
private static readonly Encoding ExpectedEncoding = new UTF8Encoding(false);
1717
private readonly JsonSerializer _defaultSerializer;
@@ -34,12 +34,12 @@ internal class JsonNetSerializer : IElasticsearchSerializer
3434
// to be a good compromise buffer size for performance throughput and bytes allocated.
3535
protected virtual int BufferSize => 1024;
3636

37-
public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null) { }
37+
public InternalSerializer(IConnectionSettingsValues settings) : this(settings, null) { }
3838

3939
/// <summary>
4040
/// this constructor is only here for stateful (de)serialization
4141
/// </summary>
42-
protected internal JsonNetSerializer(IConnectionSettingsValues settings, JsonConverter statefulConverter)
42+
protected internal InternalSerializer(IConnectionSettingsValues settings, JsonConverter statefulConverter)
4343
{
4444
this.Settings = settings;
4545
var piggyBackState = statefulConverter == null ? null : new JsonConverterPiggyBackState { ActualJsonConverter = statefulConverter };

src/Nest/CommonAbstractions/SerializationBehavior/StatefulSerializerFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Nest
99
{
1010
internal class StatefulSerializerFactory
1111
{
12-
public JsonNetSerializer CreateStateful(IConnectionSettingsValues settings, JsonConverter converter) =>
13-
new JsonNetSerializer(settings, converter);
12+
public InternalSerializer CreateStateful(IConnectionSettingsValues settings, JsonConverter converter) =>
13+
new InternalSerializer(settings, converter);
1414
}
1515
}

src/Serializers/Nest.JsonNetSerializer/ConnectionSettingsAwareSerializerBase.Customization.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.Text;
45
using System.Threading;
@@ -61,6 +62,7 @@ public void Serialize<T>(T data, Stream stream, SerializationFormatting formatti
6162

6263
//we still support net45 so Task.Completed is not available
6364
private static readonly Task CompletedTask = Task.FromResult(false);
65+
6466
public Task SerializeAsync<T>(T data, Stream stream, SerializationFormatting formatting = SerializationFormatting.Indented,
6567
CancellationToken cancellationToken = default(CancellationToken))
6668
{

src/Serializers/Nest.JsonNetSerializer/ConnectionSettingsAwareSerializerBase.Serializer.cs

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,31 @@ namespace Nest.JsonNetSerializer
1010
{
1111
public abstract partial class ConnectionSettingsAwareSerializerBase
1212
{
13+
protected Func<JsonSerializerSettings> JsonSerializerSettingsFactory { get; }
14+
protected Action<ConnectionSettingsAwareContractResolver> ModifyContractResolverCallback { get; }
15+
protected IEnumerable<JsonConverter> ContractJsonConverters { get; }
16+
1317
protected IConnectionSettingsValues ConnectionSettings { get; }
18+
1419
protected IElasticsearchSerializer BuiltinSerializer { get; }
1520

1621
private List<JsonConverter> Converters { get; }
1722

18-
protected ConnectionSettingsAwareSerializerBase(
23+
protected ConnectionSettingsAwareSerializerBase(IElasticsearchSerializer builtinSerializer, IConnectionSettingsValues connectionSettings)
24+
: this(builtinSerializer, connectionSettings, null, null, null) { }
25+
26+
internal ConnectionSettingsAwareSerializerBase(
1927
IElasticsearchSerializer builtinSerializer,
20-
IConnectionSettingsValues connectionSettings)
28+
IConnectionSettingsValues connectionSettings,
29+
Func<JsonSerializerSettings> jsonSerializerSettingsFactory,
30+
Action<ConnectionSettingsAwareContractResolver> modifyContractResolver,
31+
IEnumerable<JsonConverter> contractJsonConverters)
2132
{
33+
34+
JsonSerializerSettingsFactory = jsonSerializerSettingsFactory;
35+
ModifyContractResolverCallback = modifyContractResolver;
36+
ContractJsonConverters = contractJsonConverters ?? Enumerable.Empty<JsonConverter>();
37+
2238
ConnectionSettings = connectionSettings;
2339
BuiltinSerializer = builtinSerializer;
2440
this.Converters = new List<JsonConverter>
@@ -28,62 +44,32 @@ protected ConnectionSettingsAwareSerializerBase(
2844
};
2945
_serializer = CreateSerializer(SerializationFormatting.Indented);
3046
_collapsedSerializer = CreateSerializer(SerializationFormatting.None);
31-
3247
}
3348

49+
3450
private JsonSerializer CreateSerializer(SerializationFormatting formatting)
3551
{
36-
var s = CreateJsonSerializerSettings();
52+
var s = CreateJsonSerializerSettings() ?? new JsonSerializerSettings();;
3753
var converters = CreateJsonConverters() ?? Enumerable.Empty<JsonConverter>();
3854
var contract = CreateContractResolver();
3955
s.Formatting = formatting == SerializationFormatting.Indented ? Formatting.Indented : Formatting.None;
4056
s.ContractResolver = contract;
4157
s.Converters = converters.Concat(this.Converters).ToList();
4258
return JsonSerializer.Create(s);
4359
}
60+
4461
private IContractResolver CreateContractResolver()
4562
{
4663
var contract = new ConnectionSettingsAwareContractResolver(this.ConnectionSettings);
4764
ModifyContractResolver(contract);
4865
return contract;
4966
}
5067

51-
protected abstract JsonSerializerSettings CreateJsonSerializerSettings();
52-
53-
//TODO
54-
protected abstract IEnumerable<JsonConverter> CreateJsonConverters();
55-
56-
protected virtual void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver) { }
57-
}
58-
59-
public class JsonNetSerializer : ConnectionSettingsAwareSerializerBase
60-
{
61-
private readonly Func<JsonSerializerSettings> _jsonSerializerSettingsFactory;
62-
private readonly Action<ConnectionSettingsAwareContractResolver> _modifyContractResolver;
63-
private readonly IEnumerable<JsonConverter> _contractJsonConverters;
64-
65-
public static IElasticsearchSerializer Default(IElasticsearchSerializer builtin, IConnectionSettingsValues values)
66-
=> new JsonNetSerializer(builtin, values);
67-
68-
public JsonNetSerializer(
69-
IElasticsearchSerializer builtinSerializer,
70-
IConnectionSettingsValues connectionSettings,
71-
Func<JsonSerializerSettings> jsonSerializerSettingsFactory = null,
72-
Action<ConnectionSettingsAwareContractResolver> modifyContractResolver = null,
73-
IEnumerable<JsonConverter> contractJsonConverters = null)
74-
: base(builtinSerializer, connectionSettings)
75-
{
76-
_jsonSerializerSettingsFactory = jsonSerializerSettingsFactory;
77-
_modifyContractResolver = modifyContractResolver;
78-
_contractJsonConverters = contractJsonConverters ?? Enumerable.Empty<JsonConverter>();
79-
}
80-
81-
protected override JsonSerializerSettings CreateJsonSerializerSettings() => _jsonSerializerSettingsFactory?.Invoke();
82-
83-
protected override IEnumerable<JsonConverter> CreateJsonConverters() => _contractJsonConverters;
68+
protected virtual JsonSerializerSettings CreateJsonSerializerSettings() => JsonSerializerSettingsFactory?.Invoke();
8469

85-
protected override void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver) =>
86-
_modifyContractResolver?.Invoke(resolver);
70+
protected virtual IEnumerable<JsonConverter> CreateJsonConverters() => ContractJsonConverters;
8771

72+
protected virtual void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver) =>
73+
ModifyContractResolverCallback?.Invoke(resolver);
8874
}
8975
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Elasticsearch.Net;
4+
using Newtonsoft.Json;
5+
6+
namespace Nest.JsonNetSerializer
7+
{
8+
public class JsonNetSerializer : ConnectionSettingsAwareSerializerBase
9+
{
10+
public static IElasticsearchSerializer Default(IElasticsearchSerializer builtin, IConnectionSettingsValues values)
11+
=> new JsonNetSerializer(builtin, values);
12+
13+
public JsonNetSerializer(
14+
IElasticsearchSerializer builtinSerializer,
15+
IConnectionSettingsValues connectionSettings,
16+
Func<JsonSerializerSettings> jsonSerializerSettingsFactory = null,
17+
Action<ConnectionSettingsAwareContractResolver> modifyContractResolver = null,
18+
IEnumerable<JsonConverter> contractJsonConverters = null)
19+
: base(builtinSerializer, connectionSettings, jsonSerializerSettingsFactory, modifyContractResolver, contractJsonConverters)
20+
{
21+
}
22+
23+
}
24+
}

src/Tests/Framework/ManagedElasticsearch/SourceSerializers/TestSourceSerializerBase.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ protected override IEnumerable<JsonConverter> CreateJsonConverters()
2828
protected override void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver)
2929
{
3030
resolver.NamingStrategy = new CamelCaseNamingStrategy();
31-
base.ModifyContractResolver(resolver);
3231
}
3332
}
3433
}

0 commit comments

Comments
 (0)