c#/.net core3.0 System.Text.Json - JsonSerializer.SerializeAsync?
c#/.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} //确定
{} //为什么?
同样的代码,输出不同的结果,为什么?
这是因为System.Text.Json.Serializer.SerializeAsync是一个泛型方法,它使用的是泛型参数,而不是运行时间类型。
您需要调用:
await JsonSerializer.SerializeAsync(stream, obj, obj.GetType());
;或
await JsonSerializer.SerializeAsync<T>(stream, obj);
请注意,此行为不同于 Json.NET,因为 JsonConvert 的 SerializeObject 使用 运行时间类型。
测试
代码
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()
不遵守相同的规则,并且在明确告知序列化 [=15= 时反序列化 运行-time 类型].
我创建测试控制台应用程序,(使用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} //确定
{} //为什么?
同样的代码,输出不同的结果,为什么?
这是因为System.Text.Json.Serializer.SerializeAsync是一个泛型方法,它使用的是泛型参数,而不是运行时间类型。
您需要调用:
await JsonSerializer.SerializeAsync(stream, obj, obj.GetType());
;或await JsonSerializer.SerializeAsync<T>(stream, obj);
请注意,此行为不同于 Json.NET,因为 JsonConvert 的 SerializeObject 使用 运行时间类型。
测试
代码
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()
不遵守相同的规则,并且在明确告知序列化 [=15= 时反序列化 运行-time 类型].