Nuevas sobrecargas del generador de origen JsonSerializer

La característica del generador de origen System.Text.Json agregó nuevas sobrecargas a JsonSerializer que aceptan información de tipo generada previamente a través de JsonTypeInfo<T> o JsonSerializerContext. Estas sobrecargas proporcionan una optimización del rendimiento sobre las sobrecargas preexistentes que toman instancias JsonSerializerOptions y realizan la reflexión en el entorno de ejecución. Todos estos tipos de parámetros son tipos de referencia para los que se puede pasar null. En el ejemplo siguiente se muestran los patrones de firma de método para ambos enfoques:

Sobrecargas basadas en JsonSerializerOptions/reflexión preexistente:

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);

Nuevas sobrecargas basadas en JsonTypeInfo/JsonSerializerContext/generador de origen:

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);

Comportamiento anterior

Podría escribir un código que pasara null como valor del parámetro JsonSerializerOptions, y se compilara y ejecutara correctamente.

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

Comportamiento nuevo

Los nuevos métodos de generador de origen de .NET 6 pueden introducir ambigüedad del compilador si se pasa null para el parámetro JsonSerializerOptions. Por ejemplo, puede ver el mensaje de error siguiente:

La llamada es ambigua entre los siguientes métodos o propiedades: "JsonSerializer.Serialize(TValue, JsonSerializerOptions?)" y "JsonSerializer.Serialize(TValue, JsonTypeInfo)

Versión introducida

.NET 6

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad de orígenes.

Motivo del cambio

Se agregaron nuevas sobrecargas al serializador como optimización del rendimiento. Para obtener más información, consulte Pruebe el nuevo generador de origen System.Text.Json.

Actualice el código de una manera que desambigüe la sobrecarga deseada, como realizar una conversión explícita al destino previsto. Por ejemplo, puede cambiar el ejemplo en la sección Comportamiento anterior como se muestra a continuación:

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

Otras soluciones adicionales incluyen:

  • Omisión del parámetro opcional JsonSerializerOptions? options = null.
  • Uso de argumentos con nombre.

Sin embargo, no puede omitir parámetros opcionales ni usar argumentos con nombre en una expresión lambda.

API afectadas

Todos los métodos System.Text.Json.JsonSerializer.