Udostępnij za pośrednictwem


deserializator oparty na Emocje ionie chętnie rozpoznaje metadane

Serializator oparty na odbiciu System.Text.Json wcześniej używał leniwego podejścia do ładowania w celu rozpoznawania metadanych właściwości. Takie podejście umożliwiło operacjom weryfikacji koncepcji, które zawierały nieobsługiwane typy właściwości do deserializacji pomyślnie, pod warunkiem, że bazowy kod JSON nie jest powiązany z żadną z nieobsługiwanych właściwości. (Mimo faktu, że wystąpienia tego samego typu nie będą serializowane).

Począwszy od platformy .NET 8, serializator został zmieniony tak, aby wszystkie właściwości były chętnie rozpoznawane zarówno w serializacji, jak i deserializacji. Ta zmiana została wprowadzona w celu dodania lepszej obsługi łączenia wielu rozpoznawania nazw, co wymaga wczesnej analizy grafu typu serializowanego. Efektem ubocznym tej zmiany jest to, że jeśli zależysz od poprzedniego zachowania, możesz zacząć widzieć nowe błędy deserializacji środowiska uruchomieniowego.

Poprzednie zachowanie

Poniższy kod deserializacji zakończył się pomyślnie na platformie .NET 7.

var result = JsonSerializer.Deserialize<MyPoco>("""{ "Value": 1 }"""); //, MyContext.Default.MyPoco);
Console.WriteLine(result.Value);

public class MyPoco
{
    public int Value { get; set; }

    public NestedValue Unsupported { get; set; }
}

public class NestedValue
{
    public ReadOnlySpan<byte> Span => Array.Empty<byte>();
}

Nowe zachowanie

Począwszy od platformy .NET 8, ten sam kod z poprzedniej sekcji zachowania zgłasza błąd InvalidOperationException w czasie wykonywania.

System.InvalidOperationException: typ "System.ReadOnlySpan"1[System.Byte]" właściwości "Span" w typie "NestedValue" jest nieprawidłowy dla serializacji lub deserializacji, ponieważ jest to typ wskaźnika, jest strukturą ref lub zawiera parametry ogólne, które nie zostały zastąpione przez określone typy.

Ten błąd jest zgodny z błędem zgłoszonym nawet w poprzednich wersjach, jeśli podjęto próbę serializacji wystąpienia tego samego typu. Jest on również zgodny z generatorem źródłowym, który generuje błąd czasu kompilacji.

Wprowadzona wersja

.NET 8 (wersja zapoznawcza 4)

Typ zmiany powodującej niezgodność

Ta zmiana jest zmianą behawioralną.

Przyczyna wprowadzenia zmiany

Ta zmiana była konieczna przez nowe wymagania związane z obsługą serializacji szybkiej ścieżki w połączonych kontekstach generowanych przez źródło (zobacz dotnet/runtime#71933).

Jeśli ta zmiana jest dla Ciebie problematyczna, możesz:

  • Usuń nieobsługiwaną właściwość z typu.

  • Utwórz niestandardowy konwerter dla nieobsługiwanego typu.

  • JsonIgnoreAttribute Dodaj atrybut:

    public class MyPoco
    {
        public int Value { get; set; }
    
        [JsonIgnore]
        public NestedValue Unsupported { get; set; }
    }
    

Dotyczy interfejsów API