Skip to content

Commit dd397ec

Browse files
jonyadamitMpdreamz
authored andcommitted
enable conveniently overriding json serialization settings without the need to implement a custom serializer
1 parent bac97eb commit dd397ec

File tree

3 files changed

+20
-15
lines changed

3 files changed

+20
-15
lines changed

src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,25 @@ protected virtual void ModifyJsonSerializerSettings(JsonSerializerSettings setti
3030

3131
protected virtual IList<Func<Type, JsonConverter>> ContractConverters => null;
3232

33-
public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null) { }
33+
public JsonNetSerializer(IConnectionSettingsValues settings, Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier) : this(settings, null, settingsModifier) { }
34+
35+
public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null, null) { }
3436

3537
/// <summary>
3638
/// this constructor is only here for stateful (de)serialization
3739
/// </summary>
3840
protected internal JsonNetSerializer(
3941
IConnectionSettingsValues settings,
40-
JsonConverter statefulConverter
42+
JsonConverter statefulConverter,
43+
Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier = null
4144
)
4245
{
4346
this.Settings = settings;
44-
4547
var piggyBackState = statefulConverter == null ? null : new JsonConverterPiggyBackState { ActualJsonConverter = statefulConverter };
4648
// ReSharper disable once VirtualMemberCallInContructor
4749
this.ContractResolver = new ElasticContractResolver(this.Settings, this.ContractConverters) { PiggyBackState = piggyBackState };
4850

49-
this._defaultSerializer = JsonSerializer.Create(this.CreateSettings(SerializationFormatting.None));
50-
var indentedSerializer = JsonSerializer.Create(this.CreateSettings(SerializationFormatting.Indented));
51-
this._defaultSerializers = new Dictionary<SerializationFormatting, JsonSerializer>
52-
{
53-
{ SerializationFormatting.None, this._defaultSerializer },
54-
{ SerializationFormatting.Indented, indentedSerializer }
55-
};
51+
OverwriteDefaultSerializers(settingsModifier ?? ((s, csv) => { }));
5652
}
5753

5854
/// <summary>

src/Nest/CommonAbstractions/SerializationBehavior/SerializerFactory.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,24 @@ public interface ISerializerFactory
1818
public class SerializerFactory : ISerializerFactory
1919
{
2020
private Func<IConnectionSettingsValues, IElasticsearchSerializer> _serializerFactoryFunc;
21+
private Action<JsonSerializerSettings, IConnectionSettingsValues> _settingsModifier;
2122

2223
public SerializerFactory()
2324
{
2425

2526
}
26-
public SerializerFactory(Func<IConnectionSettingsValues , IElasticsearchSerializer> serializerFactoryFunc)
27+
public SerializerFactory(Func<IConnectionSettingsValues, IElasticsearchSerializer> serializerFactoryFunc) : this(serializerFactoryFunc, null) { }
28+
29+
public SerializerFactory(Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier) : this(null, settingsModifier) { }
30+
31+
public SerializerFactory(Func<IConnectionSettingsValues, IElasticsearchSerializer> serializerFactoryFunc, Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier)
2732
{
2833
this._serializerFactoryFunc = serializerFactoryFunc;
34+
this._settingsModifier = settingsModifier;
2935
}
3036

3137
public IElasticsearchSerializer Create(IConnectionSettingsValues settings) =>
32-
this._serializerFactoryFunc?.Invoke(settings) ?? new JsonNetSerializer(settings);
38+
this._serializerFactoryFunc?.Invoke(settings) ?? new JsonNetSerializer(settings, this._settingsModifier);
3339

3440
public IElasticsearchSerializer CreateStateful(IConnectionSettingsValues settings, JsonConverter converter) =>
3541
new JsonNetSerializer(settings, converter);

src/Tests/ClientConcepts/LowLevel/Connecting.doc.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,15 +296,18 @@ protected override HttpClientHandler CreateHttpClientHandler(RequestData request
296296
*/
297297
public class MyJsonNetSerializer : JsonNetSerializer
298298
{
299-
public MyJsonNetSerializer(IConnectionSettingsValues settings) : base(settings) { }
299+
public MyJsonNetSerializer(IConnectionSettingsValues settings) : base(settings, (s, csv) => s.PreserveReferencesHandling = PreserveReferencesHandling.All) //<1> Call this constructor if you only need access to `JsonSerializerSettings` without state
300+
{
301+
OverwriteDefaultSerializers((s, cvs) => ModifySerializerSettings(s)); //<2> Call OverwriteDefaultSerializers if you need access to `JsonSerializerSettings` with state
302+
}
300303

301304
public int CallToModify { get; set; } = 0;
302305

303-
protected override void ModifyJsonSerializerSettings(JsonSerializerSettings settings) => ++CallToModify; //<1> Override ModifyJsonSerializerSettings if you need access to `JsonSerializerSettings`
306+
private void ModifySerializerSettings(JsonSerializerSettings settings) => ++CallToModify;
304307

305308
public int CallToContractConverter { get; set; } = 0;
306309

307-
protected override IList<Func<Type, JsonConverter>> ContractConverters => new List<Func<Type, JsonConverter>> //<2> You can inject contract resolved converters by implementing the ContractConverters property. This can be much faster then registering them on `JsonSerializerSettings.Converters`
310+
protected override IList<Func<Type, JsonConverter>> ContractConverters => new List<Func<Type, JsonConverter>> //<3> You can inject contract resolved converters by implementing the ContractConverters property. This can be much faster then registering them on `JsonSerializerSettings.Converters`
308311
{
309312
t => {
310313
CallToContractConverter++;

0 commit comments

Comments
 (0)