Udostępnij za pośrednictwem


Emocje a generowanie źródła wSystem.Text.Json

W tym artykule wyjaśniono różnice między odbiciem a generowaniem źródła w odniesieniu do System.Text.Json serializacji. Zawiera również wskazówki dotyczące wybierania najlepszego podejścia do danego scenariusza.

Zbieranie metadanych

Aby serializować lub deserializować typ, JsonSerializer potrzebne są informacje o sposobie uzyskiwania dostępu do składowych typu. JsonSerializer wymaga następujących informacji:

  • Jak uzyskać dostęp do metody pobierania właściwości i pól na potrzeby serializacji.
  • Jak uzyskać dostęp do konstruktora, metod ustawiających właściwości i pól na potrzeby deserializacji.
  • Informacje o atrybutach używanych do dostosowywania serializacji lub deserializacji.
  • Konfiguracja w czasie wykonywania z programu JsonSerializerOptions.

Te informacje są określane jako metadane.

Odbicie

Domyślnie JsonSerializer zbiera metadane w czasie wykonywania przy użyciu odbicia. Za każdym razem, gdy JsonSerializer trzeba serializować lub deserializować typ po raz pierwszy, zbiera i buforuje te metadane. Proces zbierania metadanych zajmuje trochę czasu i używa pamięci.

Generowanie źródła

Alternatywnie można użyć funkcji generowania źródła języka C#, System.Text.Json aby zwiększyć wydajność, zmniejszyć użycie pamięci prywatnej i ułatwić przycinanie zestawów, co zmniejsza rozmiar aplikacji. Ponadto niektórych interfejsów API odbicia nie można używać w natywnych aplikacjach AOT, dlatego należy używać generowania źródła dla tych aplikacji.

Generowanie źródła może być używane w dwóch trybach:

  • Tryb oparty na metadanych

    Podczas kompilacji System.Text.Json zbiera informacje potrzebne do serializacji i generuje pliki kodu źródłowego, które wypełniają metadane kontraktu JSON dla żądanych typów.

  • Tryb optymalizacji serializacji (szybka ścieżka)

    JsonSerializer funkcje, które dostosowują dane wyjściowe serializacji, takie jak zasady nazewnictwa i zachowywanie odwołań, przeniosą obciążenie wydajności. W trybie optymalizacji serializacji program generuje zoptymalizowany kod serializacji, System.Text.Json który używa Utf8JsonWriter bezpośrednio. Ten zoptymalizowany lub szybki kod ścieżki zwiększa przepływność serializacji.

    Deserializacja szybkiej ścieżki nie jest obecnie dostępna. Aby uzyskać więcej informacji, zobacz dotnet/runtime issue 55043 (problem 55043).

Generowanie źródła dla System.Text.Json programu wymaga języka C# 9.0 lub nowszej wersji.

Porównanie funkcji

Wybierz tryby odbicia lub generowania źródła na podstawie następujących korzyści oferowanych przez każdą z nich:

Korzyści Odbicie Generowanie źródła
(Tryb oparty na metadanych)
Generowanie źródła
(Tryb optymalizacji serializacji)
Prostsze w kodzie. ✔️
Prostsze debugowanie. ✔️ ✔️
Obsługuje członków innych niż publiczne. ✔️ ✔️* ✔️*
Obsługuje wszystkie dostępne dostosowania serializacji. ✔️
Skraca czas uruchamiania. ✔️ ✔️
Zmniejsza użycie pamięci prywatnej. ✔️ ✔️
Eliminuje odbicie w czasie wykonywania. ✔️ ✔️
Ułatwia zmniejszenie rozmiaru aplikacji bezpiecznych w przycinaniu. ✔️ ✔️
Zwiększa przepływność serializacji. ✔️

* Generator źródła obsługuje niektóre elementy członkowskie inne niż publiczne, na przykład typy wewnętrzne w tym samym zestawie. † kontrakty generowane przez źródło można modyfikować przy użyciu interfejsu API dostosowywania kontraktu.

Korzyści Odbicie Generowanie źródła
(Tryb oparty na metadanych)
Generowanie źródła
(Tryb optymalizacji serializacji)
Prostsze w kodzie. ✔️
Prostsze debugowanie. ✔️
Obsługuje metody dostępu inne niż publiczne. ✔️
Obsługuje wymagane właściwości. ✔️
Obsługuje właściwości tylko do inicjowania. ✔️
Skraca czas uruchamiania. ✔️ ✔️
Zmniejsza użycie pamięci prywatnej. ✔️ ✔️
Eliminuje odbicie w czasie wykonywania. ✔️ ✔️
Ułatwia zmniejszenie rozmiaru aplikacji bezpiecznych w przycinaniu. ✔️ ✔️
Zwiększa przepływność serializacji. ✔️