С #/.NET core3.0 System.Text.Json - JsonSerializer.SerializeAsync?

Я создаю тестовое консольное приложение (используйте net core3.0) и код, как показано ниже:

using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

namespace TestConsoleApp1
{
    class Program
    {
        async static Task Main(string[] args)
        {
            var obj = new { Name = "Test", Age = 18 };

            string json = string.Empty;
            using (var stream = new MemoryStream())
            {
                await JsonSerializer.SerializeAsync(stream, obj);
                stream.Position = 0;
                using var reader = new StreamReader(stream);
                json = await reader.ReadToEndAsync();
            }

            Console.WriteLine(json);    //output {"Name":"Test","Age":18}, is ok
            Console.WriteLine(await GetJson(obj));  //output {}, why?

            Console.ReadLine();
        }

        private static async Task<string> GetJson(object obj)
        {
            string json = string.Empty;
            using (var stream = new MemoryStream())
            {
                await JsonSerializer.SerializeAsync(stream, obj);
                stream.Position = 0;
                using var reader = new StreamReader(stream);
                json = await reader.ReadToEndAsync();
            }
            return json;
        }
    }
}

запустить вывод

{"Name":"Test","Age":18} // хорошо

{} //Зачем?

тот же код, но для вывода разных результатов, почему?

1 ответ

Решение

Это связано с тем, что System.Text.Json.Serializer является универсальным методом и использует универсальный параметр, а не тип среды выполнения.

Вам нужно позвонить либо:

  • await JsonSerializer.SerializeAsync(stream, obj, obj.GetType());; или
  • await JsonSerializer.SerializeAsync<T>(stream, obj);

Обратите внимание, что это поведение отличается от Json.NET, потому что SerializeObject JsonConvert использует тип времени выполнения.


Контрольная работа

Код

async static Task Main(string[] args)
    {
        var obj = new { Name = "Test", Age = 18 };

        Console.WriteLine(await GetJson(obj));
    }

    private static async Task<string> GetJson(object obj)
    {
        string json = string.Empty;
        using (var stream = new MemoryStream())
        {
            await JsonSerializer.SerializeAsync(stream, obj, obj.GetType());
            stream.Position = 0;
            using var reader = new StreamReader(stream);
            return await reader.ReadToEndAsync();
        }
    }

Выход

{"Name":"Test","Age":18}

ОБНОВИТЬ

Это еще не все, потому что неасинхронная версия Serialise() не придерживается тех же правил и десериализует тип времени выполнения, когда явно указано сериализовать <object>.

Другие вопросы по тегам