Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,29 +30,25 @@ protected virtual void ModifyJsonSerializerSettings(JsonSerializerSettings setti

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

public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null) { }
public JsonNetSerializer(IConnectionSettingsValues settings, Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier) : this(settings, null, settingsModifier) { }

public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null, null) { }

/// <summary>
/// this constructor is only here for stateful (de)serialization
/// </summary>
protected internal JsonNetSerializer(
IConnectionSettingsValues settings,
JsonConverter statefulConverter
JsonConverter statefulConverter,
Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier = null
)
{
this.Settings = settings;

var piggyBackState = statefulConverter == null ? null : new JsonConverterPiggyBackState { ActualJsonConverter = statefulConverter };
// ReSharper disable once VirtualMemberCallInContructor
this.ContractResolver = new ElasticContractResolver(this.Settings, this.ContractConverters) { PiggyBackState = piggyBackState };

this._defaultSerializer = JsonSerializer.Create(this.CreateSettings(SerializationFormatting.None));
var indentedSerializer = JsonSerializer.Create(this.CreateSettings(SerializationFormatting.Indented));
this._defaultSerializers = new Dictionary<SerializationFormatting, JsonSerializer>
{
{ SerializationFormatting.None, this._defaultSerializer },
{ SerializationFormatting.Indented, indentedSerializer }
};
OverwriteDefaultSerializers(settingsModifier ?? ((s, csv) => { }));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,24 @@ public interface ISerializerFactory
public class SerializerFactory : ISerializerFactory
{
private Func<IConnectionSettingsValues, IElasticsearchSerializer> _serializerFactoryFunc;
private Action<JsonSerializerSettings, IConnectionSettingsValues> _settingsModifier;

public SerializerFactory()
{

}
public SerializerFactory(Func<IConnectionSettingsValues , IElasticsearchSerializer> serializerFactoryFunc)
public SerializerFactory(Func<IConnectionSettingsValues, IElasticsearchSerializer> serializerFactoryFunc) : this(serializerFactoryFunc, null) { }

public SerializerFactory(Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier) : this(null, settingsModifier) { }

public SerializerFactory(Func<IConnectionSettingsValues, IElasticsearchSerializer> serializerFactoryFunc, Action<JsonSerializerSettings, IConnectionSettingsValues> settingsModifier)
{
this._serializerFactoryFunc = serializerFactoryFunc;
this._settingsModifier = settingsModifier;
}

public IElasticsearchSerializer Create(IConnectionSettingsValues settings) =>
this._serializerFactoryFunc?.Invoke(settings) ?? new JsonNetSerializer(settings);
this._serializerFactoryFunc?.Invoke(settings) ?? new JsonNetSerializer(settings, this._settingsModifier);

public IElasticsearchSerializer CreateStateful(IConnectionSettingsValues settings, JsonConverter converter) =>
new JsonNetSerializer(settings, converter);
Expand Down
9 changes: 6 additions & 3 deletions src/Tests/ClientConcepts/LowLevel/Connecting.doc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -296,15 +296,18 @@ protected override HttpClientHandler CreateHttpClientHandler(RequestData request
*/
public class MyJsonNetSerializer : JsonNetSerializer
{
public MyJsonNetSerializer(IConnectionSettingsValues settings) : base(settings) { }
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
{
OverwriteDefaultSerializers((s, cvs) => ModifySerializerSettings(s)); //<2> Call OverwriteDefaultSerializers if you need access to `JsonSerializerSettings` with state
}

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

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

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

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`
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`
{
t => {
CallToContractConverter++;
Expand Down