Пример #1
0
    /*
     * SIMPLER API PROPOSAL
     */

    static void JsonSerialize_Simple_Helper(ReadOnlySpan <char> input, IBufferWriter <byte> writer)
    {
        // var = RentedArray<byte>
        using (var utf8Transcoded = Utf8.ConvertFromUtf16(input))
        {
            using (var jsonEncoded = JsonEncoder.Default.Encode(utf8Transcoded.AsSpan()))
            {
                writer.Write(jsonEncoded.AsSpan());
            }
        }
    }
Пример #2
0
    static void JsonSerialize_Helper(ReadOnlySpan <char> input, IBufferWriter <byte> writer, Span <byte> scratch1, Span <byte> scratch2)
    {
        // Transcode UTF-16 -> UTF-8 in a loop.
        var utf16InputToEncode             = input;
        var utf8TranscodingOperationStatus = default(OperationStatus);

        do
        {
            utf8TranscodingOperationStatus = Utf8.ConvertFromUtf16(utf16InputToEncode, scratch1, out var utf16CharsConsumed, out var utf8BytesTranscoded);
            if (utf8TranscodingOperationStatus == OperationStatus.InvalidData)
            {
                throw new Exception("Bad input.");
            }
            if (utf16CharsConsumed == 0 && utf8TranscodingOperationStatus != OperationStatus.Done)
            {
                throw new Exception("Unexpected return value. Bailing so we don't end up in an infinite loop.");
            }

            utf16InputToEncode = utf16InputToEncode.Slice(utf16CharsConsumed);

            // Now that we've properly transcoded UTF-16 -> UTF-8, JSON-encode it and write it to the output.
            var utf8JsonInputToEncode       = scratch1.Slice(0, utf8BytesTranscoded);
            var jsonEncodingOperationStatus = default(OperationStatus);
            do
            {
                jsonEncodingOperationStatus = JsonEncoder.Default.Encode(utf8JsonInputToEncode, scratch2, out var utf8BytesConsumed, out var jsonEncodedBytesWritten);
                if (jsonEncodingOperationStatus == OperationStatus.InvalidData)
                {
                    throw new Exception("Bad input.");
                }
                if (utf8BytesConsumed == 0 && jsonEncodingOperationStatus != OperationStatus.Done)
                {
                    throw new Exception("Unexpected return value. Bailing so we don't end up in an infinite loop.");
                }

                utf8JsonInputToEncode = utf8JsonInputToEncode.Slice(utf8BytesConsumed);
                writer.Write(scratch2.Slice(0, jsonEncodedBytesWritten));
            } while (jsonEncodingOperationStatus != OperationStatus.Done);
        } while (utf8TranscodingOperationStatus != OperationStatus.Done);
    }