From 9acb079afddace98cca072b20a2115a28695b829 Mon Sep 17 00:00:00 2001 From: Azad Abbasi Date: Thu, 4 Feb 2021 11:37:48 -0800 Subject: [PATCH] =?UTF-8?q?Use=20Utf8JsonWriter=20to=20write=20JsonElement?= =?UTF-8?q?=20to=20stream=20instead=20of=20using=20th=E2=80=A6=20(#18436)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Customized/QueryRestClient.cs | 6 ++---- .../src/DigitalTwinsClient.cs | 17 ----------------- .../src/Models/QueryResult.cs | 8 ++------ .../src/StreamHelper.cs | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Customized/QueryRestClient.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Customized/QueryRestClient.cs index 0964ca39b3fc..d7f30515b2ef 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Customized/QueryRestClient.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Customized/QueryRestClient.cs @@ -16,7 +16,6 @@ internal async Task, QueryQueryTwinsHeaders>> QuerySpecification querySpecification, QueryOptions queryTwinsOptions = null, ObjectSerializer objectSerializer = null, - ObjectSerializer defaultObjectSerializer = null, CancellationToken cancellationToken = default) { if (querySpecification == null) @@ -37,7 +36,7 @@ internal async Task, QueryQueryTwinsHeaders>> case 200: { using JsonDocument document = await JsonDocument.ParseAsync(message.Response.ContentStream, default, cancellationToken).ConfigureAwait(false); - QueryResult value = QueryResult.DeserializeQueryResult(document.RootElement, objectSerializer, defaultObjectSerializer); + QueryResult value = QueryResult.DeserializeQueryResult(document.RootElement, objectSerializer); return ResponseWithHeaders.FromValue(value, headers, message.Response); } default: @@ -49,7 +48,6 @@ internal ResponseWithHeaders, QueryQueryTwinsHeaders> QueryTwins< QuerySpecification querySpecification, QueryOptions queryTwinsOptions = null, ObjectSerializer objectSerializer = null, - ObjectSerializer defaultObjectSerializer = null, CancellationToken cancellationToken = default) { if (querySpecification == null) @@ -70,7 +68,7 @@ internal ResponseWithHeaders, QueryQueryTwinsHeaders> QueryTwins< case 200: { using var document = JsonDocument.Parse(message.Response.ContentStream); - QueryResult value = QueryResult.DeserializeQueryResult(document.RootElement, objectSerializer, defaultObjectSerializer); + QueryResult value = QueryResult.DeserializeQueryResult(document.RootElement, objectSerializer); return ResponseWithHeaders.FromValue(value, headers, message.Response); } default: diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/DigitalTwinsClient.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/DigitalTwinsClient.cs index c158291a119e..af67a049af5b 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/DigitalTwinsClient.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/DigitalTwinsClient.cs @@ -33,12 +33,6 @@ public class DigitalTwinsClient private readonly ObjectSerializer _objectSerializer; - /// - /// In order to serialize/deserialize JsonElements into and out of a stream, we have to use the out of the box ObjectSerializer (JsonObjectSerializer). - /// If the user specifies a different type of serializer to instantiate the client than the default one, the SDK will instantiate a new JsonObjectSerializer of its own. - /// - private readonly ObjectSerializer _defaultObjectSerializer; - private readonly DigitalTwinsRestClient _dtRestClient; private readonly DigitalTwinModelsRestClient _dtModelsRestClient; private readonly EventRoutesRestClient _eventRoutesRestClient; @@ -99,13 +93,6 @@ public DigitalTwinsClient(Uri endpoint, TokenCredential credential, DigitalTwins _objectSerializer = options.Serializer ?? new JsonObjectSerializer(); - // If the objectSerializer is of type JsonObjectSerializer, we will re-use the same object and set it as the defaultObjectSerializer. - // Otherwise, we will instantiate it and re-use it in the future. - _defaultObjectSerializer = - (_objectSerializer is JsonObjectSerializer) - ? _objectSerializer - : new JsonObjectSerializer(); - options.AddPolicy(new BearerTokenAuthenticationPolicy(credential, GetAuthorizationScopes()), HttpPipelinePosition.PerCall); _httpPipeline = HttpPipelineBuilder.Build(options); @@ -2058,7 +2045,6 @@ async Task> FirstPageFunc(int? pageSizeHint) querySpecification, options, _objectSerializer, - _defaultObjectSerializer, cancellationToken) .ConfigureAwait(false); @@ -2093,7 +2079,6 @@ async Task> NextPageFunc(string nextLink, int? pageSizeHint) querySpecification, options, _objectSerializer, - _defaultObjectSerializer, cancellationToken) .ConfigureAwait(false); @@ -2169,7 +2154,6 @@ Page FirstPageFunc(int? pageSizeHint) querySpecification, options, _objectSerializer, - _defaultObjectSerializer, cancellationToken); return Page.FromValues(response.Value.Value, response.Value.ContinuationToken, response.GetRawResponse()); @@ -2203,7 +2187,6 @@ Page NextPageFunc(string nextLink, int? pageSizeHint) querySpecification, options, _objectSerializer, - _defaultObjectSerializer, cancellationToken); return Page.FromValues(response.Value.Value, response.Value.ContinuationToken, response.GetRawResponse()); diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Models/QueryResult.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Models/QueryResult.cs index 3ebf3da285da..f8e5cbc3a25b 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Models/QueryResult.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/Models/QueryResult.cs @@ -40,9 +40,8 @@ internal QueryResult(IReadOnlyList value, string continuationToken) /// /// The JSON element to be deserialized into a QueryResult. /// The object serializer instance used to deserialize the items in the collection. - /// The out of the box object serializer to interact with the JsonElement (serialize/deserialize into and out of streams). /// A collection of query results deserialized into type . - internal static QueryResult DeserializeQueryResult(JsonElement element, ObjectSerializer objectSerializer, ObjectSerializer defaultObjectSerializer) + internal static QueryResult DeserializeQueryResult(JsonElement element, ObjectSerializer objectSerializer) { IReadOnlyList items = default; string continuationToken = default; @@ -60,10 +59,7 @@ internal static QueryResult DeserializeQueryResult(JsonElement element, Objec foreach (JsonElement item in property.Value.EnumerateArray()) { - // defaultObjectSerializer of type JsonObjectSerializer needs to be used to serialize the JsonElement into a stream. - // Using any other ObjectSerializer (e.g. NewtonsoftJsonObjectSerializer) won't be able to deserialize the JsonElement into - // a MemoryStream correctly. - using MemoryStream streamedObject = StreamHelper.WriteToStream(item, defaultObjectSerializer, default); + using MemoryStream streamedObject = StreamHelper.WriteJsonElementToStream(item); // To deserialize the stream object into the generic type of T, the provided ObjectSerializer will be used. T obj = (T)objectSerializer.Deserialize(streamedObject, typeof(T), default); diff --git a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/StreamHelper.cs b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/StreamHelper.cs index 350604e497ea..1b496d68328c 100644 --- a/sdk/digitaltwins/Azure.DigitalTwins.Core/src/StreamHelper.cs +++ b/sdk/digitaltwins/Azure.DigitalTwins.Core/src/StreamHelper.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System.IO; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Azure.Core.Serialization; @@ -46,5 +47,22 @@ internal static MemoryStream WriteToStream(T obj, ObjectSerializer objectSeri return memoryStream; } + + /// + /// Serializes a JsonElement and writes it into a memory stream. + /// + /// JsonElement to be deserialized into a stream. + /// A binary representation of the object written to a stream. + internal static MemoryStream WriteJsonElementToStream(JsonElement item) + { + var memoryStream = new MemoryStream(); + using var writer = new Utf8JsonWriter(memoryStream); + + item.WriteTo(writer); + writer.Flush(); + memoryStream.Seek(0, SeekOrigin.Begin); + + return memoryStream; + } } }