Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule wyjaśniono różnice między refleksją a generowaniem kodu źródłowego 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, ustawiaczy właściwości i pól na potrzeby deserializacji.
- Informacje o atrybutach używanych do dostosowywania serializacji lub deserializacji.
- Konfiguracja środowiska uruchomieniowego z JsonSerializerOptions.
Te informacje są określane jako metadane.
Odbicie
Domyślnie JsonSerializer zbiera metadane w czasie wykonywania przy użyciu refleksji. 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, System.Text.Json można użyć funkcji generowania źródeł języka C# w celu zwiększenia wydajności, zmniejszenia użycia pamięci prywatnej i ułatwienia przycinania modułó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.Jsonzbiera 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ń, wiążą się z obciążeniem wydajnościowym. W trybie optymalizacji serializacji, System.Text.Json generuje zoptymalizowany kod serializacji, który używa
Utf8JsonWriterbezpośrednio. Ten zoptymalizowany lub szybki kod ścieżki zwiększa przepływność serializacji.Szybka ścieżka deserializacji nie jest obecnie dostępna. Aby uzyskać więcej informacji, zobacz dotnet/runtime 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 niepublicznych. | ✔️ | ✔️* | ✔️* |
| Obsługuje wszystkie dostępne dostosowania serializacji. | ✔️ | ❌ † | ❌ † |
| Skraca czas uruchamiania. | ❌ | ✔️ | ✔️ |
| Zmniejsza użycie pamięci prywatnej. | ❌ | ✔️ | ✔️ |
| Eliminuje odbicie środowiska uruchomieniowego. | ❌ | ✔️ | ✔️ |
| Ułatwia bezpieczne zmniejszanie rozmiaru aplikacji. | ❌ | ✔️ | ✔️ |
| 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.