From e86f4ac93bbf32ad5d8db27dbe6205cee5b5cea5 Mon Sep 17 00:00:00 2001 From: MitchRosenburg Date: Sat, 30 Jul 2016 13:03:04 -0700 Subject: [PATCH] Use custom connection serialization settings, if available. --- .../JsonNetSerializer.cs | 9 ++++- .../Multiple/MultiGet/GetManyApiTests.cs | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs b/src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs index efb8f70eb00..16c593de52f 100644 --- a/src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs +++ b/src/Nest/CommonAbstractions/SerializationBehavior/JsonNetSerializer.cs @@ -24,7 +24,14 @@ public class JsonNetSerializer : IElasticsearchSerializer private readonly Dictionary _defaultSerializers; private readonly JsonSerializer _defaultSerializer; - protected virtual void ModifyJsonSerializerSettings(JsonSerializerSettings settings) { } + protected virtual void ModifyJsonSerializerSettings(JsonSerializerSettings settings) + { + // Apply custom serialization settings from the connection serializer, if any; avoiding infinite loop with 'this' check. + var jsonNetSerializer = this.Settings?.Serializer as JsonNetSerializer; + if (jsonNetSerializer != null && jsonNetSerializer != this) + jsonNetSerializer.ModifyJsonSerializerSettings(settings); + } + protected virtual IList> ContractConverters => null; public JsonNetSerializer(IConnectionSettingsValues settings) : this(settings, null) { } diff --git a/src/Tests/Document/Multiple/MultiGet/GetManyApiTests.cs b/src/Tests/Document/Multiple/MultiGet/GetManyApiTests.cs index 870d62c2e07..91fac916351 100644 --- a/src/Tests/Document/Multiple/MultiGet/GetManyApiTests.cs +++ b/src/Tests/Document/Multiple/MultiGet/GetManyApiTests.cs @@ -3,8 +3,10 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Elasticsearch.Net; using FluentAssertions; using Nest; +using Newtonsoft.Json; using Tests.Framework; using Tests.Framework.Integration; using Tests.Framework.MockData; @@ -52,5 +54,37 @@ public async Task UsesDefaultIndexAndInferredTypeAsync() hit.Found.Should().BeTrue(); } } + + [I] + public void UseCustomSerializationSettings() + { + const string expectedDateString = "2015-02-06T23:45:05Z"; + string jsonResponse = $@"{{ ""docs"": [ {{ ""_id"": ""1"", ""_source"": {{ ""dateString"": ""{expectedDateString}"" }}}}]}}"; + + var connection = new InMemoryConnection(Encoding.UTF8.GetBytes(jsonResponse)); + var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); + var connectionSettings = new ConnectionSettings(connectionPool, connection, settings => new LocalJsonNetSerializer(settings)).DefaultIndex("default-index"); + var client = new ElasticClient(connectionSettings); + + var hit = client.GetMany(new[] { "1" })?.FirstOrDefault(); + hit.Should().NotBeNull(); + hit.Source.Should().NotBeNull(); + hit.Source.DateString.Should().Be(expectedDateString); + } + + private sealed class HasDateString + { + public string DateString { get; set; } + } + + private sealed class LocalJsonNetSerializer : JsonNetSerializer + { + public LocalJsonNetSerializer(IConnectionSettingsValues settings) : base(settings) { } + + protected override void ModifyJsonSerializerSettings(JsonSerializerSettings settings) + { + settings.DateParseHandling = DateParseHandling.None; + } + } } }