Odbicie a generowanie źródła w System.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. | ❌ | ❌ | ✔️ |