diff --git a/src/Elastic.Transport/Components/Serialization/SystemTextJsonSerializer.cs b/src/Elastic.Transport/Components/Serialization/SystemTextJsonSerializer.cs index b61f1b8..8b32462 100644 --- a/src/Elastic.Transport/Components/Serialization/SystemTextJsonSerializer.cs +++ b/src/Elastic.Transport/Components/Serialization/SystemTextJsonSerializer.cs @@ -84,6 +84,31 @@ public override Task SerializeAsync(T data, Stream stream, #endregion Serializer + /// + /// Override to (dis-)allow fast-path (de-)serialization for specific types. + /// + /// The that is being (de-)serialized. + /// + /// if the given supports fast-path (de-)serialization or + /// , if not. + /// + /// + /// + /// Most extension methods in will prefer fast-path (de-)serialization, when + /// used with based serializer implementations. + /// Fast-path (de-)serialization bypasses the , , + /// methods and directly uses the API instead. + /// + /// + /// In some cases, when the concrete based serializer implementation overrides one or more of + /// the previously named methods, the default fast-path behavior is probably undesired as it would prevent the user defined code in + /// the overwritten methods from being executed. + /// The method can be used to either completely disable fast-path (de-)serialization or to selectively + /// allow it for specific types only. + /// + /// + protected internal virtual bool SupportsFastPath(Type type) => true; + /// /// Returns the for this serializer, based on the given . /// diff --git a/src/Elastic.Transport/Components/Serialization/TransportSerializerExtensions.cs b/src/Elastic.Transport/Components/Serialization/TransportSerializerExtensions.cs index 5ccfd9d..d9182af 100644 --- a/src/Elastic.Transport/Components/Serialization/TransportSerializerExtensions.cs +++ b/src/Elastic.Transport/Components/Serialization/TransportSerializerExtensions.cs @@ -47,7 +47,7 @@ public static byte[] SerializeToBytes( SerializationFormatting formatting = SerializationFormatting.None ) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations. return JsonSerializer.SerializeToUtf8Bytes(data, stjSerializer.GetJsonSerializerOptions(formatting)); @@ -92,7 +92,7 @@ public static byte[] SerializeToBytes( SerializationFormatting formatting = SerializationFormatting.None ) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations. return JsonSerializer.SerializeToUtf8Bytes(data, type, stjSerializer.GetJsonSerializerOptions(formatting)); @@ -135,7 +135,7 @@ public static string SerializeToString( SerializationFormatting formatting = SerializationFormatting.None ) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // serialize straight into string. @@ -183,7 +183,7 @@ public static string SerializeToString( SerializationFormatting formatting = SerializationFormatting.None ) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // serialize straight into string. @@ -234,7 +234,7 @@ public static void Serialize( MemoryStreamFactory? memoryStreamFactory, SerializationFormatting formatting = SerializationFormatting.None) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // serialize straight into the writer. @@ -294,7 +294,7 @@ public static void Serialize( MemoryStreamFactory? memoryStreamFactory, SerializationFormatting formatting = SerializationFormatting.None) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // serialize straight into the writer. @@ -332,7 +332,7 @@ public static void Serialize( string input, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -362,7 +362,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -391,7 +391,7 @@ public static void Serialize( ReadOnlySpan span, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -421,7 +421,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -450,7 +450,7 @@ public static void Serialize( ReadOnlySpan span, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -480,7 +480,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the span. @@ -509,7 +509,7 @@ public static void Serialize( ref Utf8JsonReader reader, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the reader. @@ -546,7 +546,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the reader. @@ -582,7 +582,7 @@ public static void Serialize( JsonNode node, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the node. @@ -617,7 +617,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the node. @@ -651,7 +651,7 @@ public static void Serialize( JsonElement node, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(typeof(T))) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the node. @@ -686,7 +686,7 @@ public static void Serialize( Type type, MemoryStreamFactory? memoryStreamFactory = null) { - if (serializer is SystemTextJsonSerializer stjSerializer) + if (serializer is SystemTextJsonSerializer stjSerializer && stjSerializer.SupportsFastPath(type)) { // When the serializer derives from `SystemTextJsonSerializer` we can avoid unnecessary allocations and // deserialize straight from the node. diff --git a/src/Elastic.Transport/Requests/IUrlParameter.cs b/src/Elastic.Transport/Requests/IUrlParameter.cs index ef4834b..2976bb8 100644 --- a/src/Elastic.Transport/Requests/IUrlParameter.cs +++ b/src/Elastic.Transport/Requests/IUrlParameter.cs @@ -7,6 +7,6 @@ namespace Elastic.Transport; /// Implementers define an object that can be serialized as a query string parameter public interface IUrlParameter { - /// Get the a string representation using - string GetString(ITransportConfiguration settings); + /// Get the string representation using + public string GetString(ITransportConfiguration settings); }