diff --git a/src/Elasticsearch.Net/Serialization/DiagnosticsSerializerProxy.cs b/src/Elasticsearch.Net/Serialization/DiagnosticsSerializerProxy.cs
index 668ecd6860a..22a3af50d19 100644
--- a/src/Elasticsearch.Net/Serialization/DiagnosticsSerializerProxy.cs
+++ b/src/Elasticsearch.Net/Serialization/DiagnosticsSerializerProxy.cs
@@ -32,12 +32,16 @@ public SerializerRegistrationInformation(Type type, string purpose)
public override string ToString() => _stringRepresentation;
}
+ //TODO this no longer needs to be IInternalSerializerWithFormatter
+ // Previous we checked that the serializer we are wrapping implements the interface and if so set the formatter
+ // However its totally fine for formatter to be null. `IJsonFormatter` solves this better.
///
/// Wraps configured serializer so that we can emit diagnostics per configured serializer.
///
- internal class DiagnosticsSerializerProxy : IElasticsearchSerializer, IInternalSerializerWithFormatter
+ internal class DiagnosticsSerializerProxy : IElasticsearchSerializer, IInternalSerializerWithFormatter, IInternalSerializer
{
private readonly IElasticsearchSerializer _serializer;
+ private readonly bool _wrapsUtf8JsonSerializer;
private readonly SerializerRegistrationInformation _state;
private readonly IJsonFormatterResolver _formatterResolver;
private static DiagnosticSource DiagnosticSource { get; } = new DiagnosticListener(DiagnosticSources.Serializer.SourceName);
@@ -47,11 +51,25 @@ public DiagnosticsSerializerProxy(IElasticsearchSerializer serializer, string pu
_serializer = serializer;
_state = new SerializerRegistrationInformation(serializer.GetType(), purpose);
if (serializer is IInternalSerializerWithFormatter withFormatter)
+ {
_formatterResolver = withFormatter.FormatterResolver;
+ _wrapsUtf8JsonSerializer = true;
+ }
+ else
+ {
+ _wrapsUtf8JsonSerializer = false;
+ _formatterResolver = null;
+ }
}
public IJsonFormatterResolver FormatterResolver => _formatterResolver;
+ public bool TryGetJsonFormatter(out IJsonFormatterResolver formatterResolver)
+ {
+ formatterResolver = _formatterResolver;
+ return _wrapsUtf8JsonSerializer;
+ }
+
public object Deserialize(Type type, Stream stream)
{
using (DiagnosticSource.Diagnose(DiagnosticSources.Serializer.Deserialize, _state))
diff --git a/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs b/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs
index a32d4e8f4ab..c686dc58438 100644
--- a/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs
+++ b/src/Elasticsearch.Net/Serialization/ElasticsearchSerializerExtensions.cs
@@ -1,9 +1,23 @@
using Elasticsearch.Net.Extensions;
+using Elasticsearch.Net.Utf8Json;
namespace Elasticsearch.Net
{
public static class ElasticsearchSerializerExtensions
{
+ internal static void SerializeUsingWriter(this IElasticsearchSerializer serializer, ref JsonWriter writer, T body, IConnectionConfigurationValues settings, SerializationFormatting formatting)
+ {
+ if (serializer is IInternalSerializer s && s.TryGetJsonFormatter(out var formatterResolver))
+ {
+ JsonSerializer.Serialize(ref writer, body, formatterResolver);
+ return;
+ }
+
+ var memoryStreamFactory = settings.MemoryStreamFactory;
+ var bodyBytes = serializer.SerializeToBytes(body, memoryStreamFactory, formatting);
+ writer.WriteRaw(bodyBytes);
+ }
+
///
/// Extension method that serializes an instance of to a byte array.
///
@@ -65,5 +79,6 @@ public static string SerializeToString(
return ms.Utf8String();
}
}
+
}
}
diff --git a/src/Elasticsearch.Net/Serialization/IInternalSerializerWithFormatter.cs b/src/Elasticsearch.Net/Serialization/IInternalSerializerWithFormatter.cs
index 48285f1e8df..6f050b69b6a 100644
--- a/src/Elasticsearch.Net/Serialization/IInternalSerializerWithFormatter.cs
+++ b/src/Elasticsearch.Net/Serialization/IInternalSerializerWithFormatter.cs
@@ -1,9 +1,14 @@
using Elasticsearch.Net.Utf8Json;
-namespace Elasticsearch.Net
+namespace Elasticsearch.Net
{
+ internal interface IInternalSerializer
+ {
+ bool TryGetJsonFormatter(out IJsonFormatterResolver formatterResolver);
+ }
+
internal interface IInternalSerializerWithFormatter
{
IJsonFormatterResolver FormatterResolver { get; }
}
-}
\ No newline at end of file
+}
diff --git a/src/Elasticsearch.Net/Serialization/LowLevelRequestResponseSerializer.cs b/src/Elasticsearch.Net/Serialization/LowLevelRequestResponseSerializer.cs
index 57fe93064de..2a6445d8791 100644
--- a/src/Elasticsearch.Net/Serialization/LowLevelRequestResponseSerializer.cs
+++ b/src/Elasticsearch.Net/Serialization/LowLevelRequestResponseSerializer.cs
@@ -7,29 +7,23 @@
namespace Elasticsearch.Net
{
- public class LowLevelRequestResponseSerializer : IElasticsearchSerializer
+ public class LowLevelRequestResponseSerializer : IElasticsearchSerializer, IInternalSerializerWithFormatter
{
+ IJsonFormatterResolver IInternalSerializerWithFormatter.FormatterResolver => null;
+
public static readonly LowLevelRequestResponseSerializer Instance = new LowLevelRequestResponseSerializer();
- public object Deserialize(Type type, Stream stream)
- {
- return JsonSerializer.NonGeneric.Deserialize(type, stream, ElasticsearchNetFormatterResolver.Instance);
- }
-
- public T Deserialize(Stream stream)
- {
- return JsonSerializer.Deserialize(stream, ElasticsearchNetFormatterResolver.Instance);
- }
-
- public Task