新的 JsonSerializer 源生成器重载

System.Text.Json 源生成器功能向 JsonSerializer 中添加了通过 JsonTypeInfo<T>JsonSerializerContext 接受预生成的类型信息的新重载。 这些重载对采用 JsonSerializerOptions 实例和执行运行时反射的预先存在的重载提供性能优化。 所有这些参数类型都是可以传递 null 的引用类型。 下面的示例演示了两种方法的方法签名模式:

预先存在的基于反射/JsonSerializerOptions 的重载:

public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);

基于源生成器/JsonTypeInfo/JsonSerializerContext 的重载:

public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);

旧行为

可以编写将 null 作为 JsonSerializerOptions 参数的值进行传递的代码,并成功地编译和运行该代码。

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));

新行为

如果为 JsonSerializerOptions 参数传递 null,则 .NET 6 中的新源生成器方法可能会引发编译器多义性。 例如,你可能会看到以下错误消息:

以下方法或属性之间的调用不明确: 和 'JsonSerializer.Serialize(TValue, JsonTypeInfo)

引入的版本

.NET 6

中断性变更的类型

此项更改可能会影响源兼容性

更改原因

已将新的重载作为性能优化添加到序列化程序。 有关详细信息,请参阅尝试新的 System.Text.Json 源生成器

用消除预期重载的方式更新代码,例如显式强制转换为预期目标。 例如,可以按如下所示更改旧行为部分中的示例:

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));

其他解决方法包括:

  • 省略可选参数 JsonSerializerOptions? options = null
  • 使用命名参数。

但是,不能在 lambda 表达式中省略可选参数或使用命名参数。

受影响的 API

所有 System.Text.Json.JsonSerializer 方法。