diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/IReadBufferState.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/IReadBufferState.cs index dece615313556a..5847bea2a1bd55 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/IReadBufferState.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/IReadBufferState.cs @@ -26,6 +26,9 @@ public abstract ValueTask ReadAsync( public abstract void Advance(long bytesConsumed); - public abstract Utf8JsonReader GetReader(JsonReaderState jsonReaderState); + // This would normally be implemented as returning a Utf8JsonReader, but this pattern hits a limitation + // in mono aot that is not trivial to fix. For now use the alternative pattern of returning via an out + // argument. Tracking issue: https://github.com/dotnet/runtime/issues/118697 + public abstract void GetReader(JsonReaderState jsonReaderState, out Utf8JsonReader reader); } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfoOfT.ReadHelper.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfoOfT.ReadHelper.cs index a40b8059b7574f..b8e99b30bf9ae0 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfoOfT.ReadHelper.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfoOfT.ReadHelper.cs @@ -136,7 +136,7 @@ internal bool ContinueDeserialize( out T? value) where TReadBufferState : struct, IReadBufferState { - Utf8JsonReader reader = bufferState.GetReader(jsonReaderState); + bufferState.GetReader(jsonReaderState, out Utf8JsonReader reader); try { diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/PipeReadBufferState.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/PipeReadBufferState.cs index b7ca37fe3aeb02..45bb1d85351770 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/PipeReadBufferState.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/PipeReadBufferState.cs @@ -75,11 +75,11 @@ public async ValueTask ReadAsync(PipeReader utf8Json, Cance public void Read(PipeReader utf8Json) => throw new NotImplementedException(); - public Utf8JsonReader GetReader(JsonReaderState jsonReaderState) + public void GetReader(JsonReaderState jsonReaderState, out Utf8JsonReader reader) { if (_sequence.IsSingleSegment) { - return new Utf8JsonReader( + reader = new Utf8JsonReader( #if NET _sequence.FirstSpan, #else @@ -89,7 +89,7 @@ public Utf8JsonReader GetReader(JsonReaderState jsonReaderState) } else { - return new Utf8JsonReader(_sequence, IsFinalBlock, jsonReaderState); + reader = new Utf8JsonReader(_sequence, IsFinalBlock, jsonReaderState); } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/StreamReadBufferState.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/StreamReadBufferState.cs index bf779c9f960327..65573c58bf7f04 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/StreamReadBufferState.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/StreamReadBufferState.cs @@ -157,9 +157,9 @@ public void Advance(long bytesConsumed) _offset = 0; } - public Utf8JsonReader GetReader(JsonReaderState jsonReaderState) + public void GetReader(JsonReaderState jsonReaderState, out Utf8JsonReader reader) { - return new Utf8JsonReader( + reader = new Utf8JsonReader( _buffer.AsSpan(_offset, _count), IsFinalBlock, jsonReaderState);