С #/.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>
.