Skip to content
Merged
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
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/api/Azure.Core.net461.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,8 @@ protected internal virtual void SetHeader(string name, string value) { }
public abstract partial class RequestContent : System.IDisposable
{
protected RequestContent() { }
public static Azure.Core.RequestContent Create(Azure.Core.SequenceWriter writer) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.DynamicData content) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.IModelSerializable<object> model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; }
public static Azure.Core.RequestContent Create(System.BinaryData content) { throw null; }
public static Azure.Core.RequestContent Create(System.Buffers.ReadOnlySequence<byte> bytes) { throw null; }
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/api/Azure.Core.net5.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,8 @@ protected internal virtual void SetHeader(string name, string value) { }
public abstract partial class RequestContent : System.IDisposable
{
protected RequestContent() { }
public static Azure.Core.RequestContent Create(Azure.Core.SequenceWriter writer) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.DynamicData content) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.IModelSerializable<object> model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; }
public static Azure.Core.RequestContent Create(System.BinaryData content) { throw null; }
public static Azure.Core.RequestContent Create(System.Buffers.ReadOnlySequence<byte> bytes) { throw null; }
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/api/Azure.Core.net6.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,8 @@ protected internal virtual void SetHeader(string name, string value) { }
public abstract partial class RequestContent : System.IDisposable
{
protected RequestContent() { }
public static Azure.Core.RequestContent Create(Azure.Core.SequenceWriter writer) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.DynamicData content) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.IModelSerializable<object> model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; }
public static Azure.Core.RequestContent Create(System.BinaryData content) { throw null; }
public static Azure.Core.RequestContent Create(System.Buffers.ReadOnlySequence<byte> bytes) { throw null; }
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,8 @@ protected internal virtual void SetHeader(string name, string value) { }
public abstract partial class RequestContent : System.IDisposable
{
protected RequestContent() { }
public static Azure.Core.RequestContent Create(Azure.Core.SequenceWriter writer) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.DynamicData content) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.IModelSerializable<object> model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; }
public static Azure.Core.RequestContent Create(System.BinaryData content) { throw null; }
public static Azure.Core.RequestContent Create(System.Buffers.ReadOnlySequence<byte> bytes) { throw null; }
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,8 @@ protected internal virtual void SetHeader(string name, string value) { }
public abstract partial class RequestContent : System.IDisposable
{
protected RequestContent() { }
public static Azure.Core.RequestContent Create(Azure.Core.SequenceWriter writer) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.DynamicData content) { throw null; }
public static Azure.Core.RequestContent Create(Azure.Core.Serialization.IModelSerializable<object> model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; }
public static Azure.Core.RequestContent Create(System.BinaryData content) { throw null; }
public static Azure.Core.RequestContent Create(System.Buffers.ReadOnlySequence<byte> bytes) { throw null; }
public static Azure.Core.RequestContent Create(byte[] bytes) { throw null; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public void SetUp()
_model = ModelSerializer.Deserialize<T>(_data);
_response = new MockResponse(200);
_response.ContentStream = new MemoryStream(Encoding.UTF8.GetBytes(_json));
_options = new ModelSerializerOptions(ModelSerializerFormat.Wire);
_options = ModelSerializerOptions.DefaultServiceOptions;
_content = new SequenceWriter();
using Utf8JsonWriter writer = new Utf8JsonWriter(_content);
_model.Serialize(writer, new ModelSerializerOptions());
Expand Down Expand Up @@ -89,13 +89,6 @@ public void Serialize_ImplicitCastWithUsage()
x.WriteTo(stream, default);
}

[Benchmark]
[BenchmarkCategory("Cast")]
public RequestContent CreateRequestContent()
{
return RequestContent.Create(_content);
}

[Benchmark]
[BenchmarkCategory("ModelJsonConverter")]
public string Serialize_ModelJsonConverter()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void SetUp()
_model = ModelSerializer.Deserialize<T>(_data);
_response = new MockResponse(200);
_response.ContentStream = new MemoryStream(Encoding.UTF8.GetBytes(_xml));
_options = new ModelSerializerOptions(ModelSerializerFormat.Wire);
_options = ModelSerializerOptions.DefaultServiceOptions;
_element = XElement.Parse(_xml);
}

Expand Down
105 changes: 95 additions & 10 deletions sdk/core/Azure.Core/src/RequestContent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using Azure.Core.Buffers;
using Azure.Core.Serialization;

Expand Down Expand Up @@ -89,9 +90,10 @@ public abstract class RequestContent : IDisposable
/// <summary>
/// Creates an instance of <see cref="RequestContent"/> that wraps a serialized version of an object.
/// </summary>
/// <param name="writer">The <see cref="SequenceWriter"/> that contains the serialized data.</param>
/// <param name="model">The <see cref="IModelSerializable{T}"/> to serialize.</param>
/// <param name="options">The <see cref="ModelSerializerOptions"/> to use.</param>
/// <returns>An instance of <see cref="RequestContent"/> that wraps a serialized version of the object.</returns>
public static RequestContent Create(SequenceWriter writer) => new SequenceWriterContent(writer);
public static RequestContent Create(IModelSerializable<object> model, ModelSerializerOptions? options = default) => new ModelSerializableContent(model, options ?? ModelSerializerOptions.DefaultServiceOptions);

/// <summary>
/// Creates an instance of <see cref="RequestContent"/> that wraps a serialized version of an object.
Expand Down Expand Up @@ -227,22 +229,105 @@ public override void Dispose()
}
}

private sealed class SequenceWriterContent : RequestContent
private sealed class ModelSerializableContent : RequestContent
{
private readonly SequenceWriter _writer;
private SequenceWriter? _writer;
private BinaryData? _data;
private byte[]? _bytes;
private readonly IModelSerializable<object> _model;
private readonly ModelSerializerOptions _options;

public SequenceWriterContent(SequenceWriter writer)
public ModelSerializableContent(IModelSerializable<object> model, ModelSerializerOptions options)
{
_writer = writer;
_model = model;
_options = options;
}

public override void Dispose() => _writer.Dispose();
public override void Dispose() => _writer?.Dispose();

public override void WriteTo(Stream stream, CancellationToken cancellation) => _writer.CopyTo(stream, cancellation);
private SequenceWriter GetWriter(IModelJsonSerializable<object> model)
{
if (_writer is null)
{
var writer = new SequenceWriter();
using var jsonWriter = new Utf8JsonWriter(writer);
model.Serialize(jsonWriter, _options);
jsonWriter.Flush();
_writer = writer;
}
return _writer;
}

private BinaryData GetBinaryData()
{
if (_data is null)
{
_data = _model.Serialize(_options);
}
return _data;
}

public override bool TryComputeLength(out long length) => _writer.TryComputeLength(out length);
private byte[] GetBytes()
{
if (_bytes is null)
{
_bytes = GetBinaryData().ToArray();
}
return _bytes;
}

public override async Task WriteToAsync(Stream stream, CancellationToken cancellation) => await _writer.CopyToAsync(stream, cancellation).ConfigureAwait(false);
public override void WriteTo(Stream stream, CancellationToken cancellation)
{
// a model implements both xml and json we don't know the wire format and must let the model decide.
if (_model is IModelJsonSerializable<object> jsonSerializable && _model is not IModelXmlSerializable<object>)
{
GetWriter(jsonSerializable).CopyTo(stream, cancellation);
}
else if (_model is IModelXmlSerializable<object> xmlSerializable && _model is not IModelJsonSerializable<object>)
{
using XmlWriter writer = XmlWriter.Create(stream);
xmlSerializable.Serialize(writer, _options);
writer.Flush();
}
else
{
var data = GetBinaryData();
#if NETFRAMEWORK || NETSTANDARD2_0
var bytes = GetBytes();
stream.Write(bytes, 0, bytes.Length);
#else
stream.Write(data.ToMemory().Span);
#endif
}
}

public override bool TryComputeLength(out long length)
{
if (_model is IModelJsonSerializable<object> jsonSerializable && _model is not IModelXmlSerializable<object>)
return GetWriter(jsonSerializable).TryComputeLength(out length);

length = 0;
return false;
}

public override async Task WriteToAsync(Stream stream, CancellationToken cancellation)
{
if (_model is IModelJsonSerializable<object> jsonSerializable && _model is not IModelXmlSerializable<object>)
{
await GetWriter(jsonSerializable).CopyToAsync(stream, cancellation).ConfigureAwait(false);
}
else if (_model is IModelXmlSerializable<object> xmlSerializable && _model is not IModelJsonSerializable<object>)
{
using XmlWriter writer = XmlWriter.Create(stream);
xmlSerializable.Serialize(writer, _options);
await writer.FlushAsync().ConfigureAwait(false);
}
else
{
var data = GetBinaryData();
await stream.WriteAsync(data.ToMemory(), cancellation).ConfigureAwait(false);
}
}
}

private sealed class ArrayContent : RequestContent
Expand Down
81 changes: 0 additions & 81 deletions sdk/core/Azure.Core/src/Shared/Utf8JsonDelayedRequestContent.cs

This file was deleted.

82 changes: 0 additions & 82 deletions sdk/core/Azure.Core/src/Shared/Utf8XmlDelayedRequestContent.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
<!-- Shared source from Azure.Core -->
<ItemGroup>
<Compile Include="$(AzureCoreSharedSources)ArrayBufferWriter.cs" LinkBase="Shared/Core" />
<Compile Include="$(AzureCoreSharedSources)Utf8JsonDelayedRequestContent.cs" LinkBase="Shared/Core" />
<Compile Include="$(AzureCoreSharedSources)Utf8XmlDelayedRequestContent.cs" LinkBase="Shared/Core" />
<Compile Include="$(AzureCoreSharedSources)Utf8JsonReaderExtensions.cs" LinkBase="Shared/Core" />
<Compile Include="$(AzureCoreSharedSources)ModelSerializerHelper.cs" LinkBase="Shared/Core" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ internal Envelope(string property, CatReadOnlyProperty cat, T modelC, Dictionary
public T ModelT { get; set; }

#region Serialization
void IUtf8JsonSerializable.Write(Utf8JsonWriter writer) => ((IModelJsonSerializable<Envelope<T>>)this).Serialize(writer, new ModelSerializerOptions(ModelSerializerFormat.Wire));
void IUtf8JsonSerializable.Write(Utf8JsonWriter writer) => ((IModelJsonSerializable<Envelope<T>>)this).Serialize(writer, ModelSerializerOptions.DefaultServiceOptions);

void IModelJsonSerializable<Envelope<T>>.Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) => Serialize(writer, options);

Expand Down
Loading