新的 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 表达式中省略可选参数或使用命名参数。