Bagikan melalui


Konstruktor non-publik dan tanpa parameter tidak digunakan untuk deserialisasi

Untuk konsistensi di semua moniker kerangka kerja target (TFM) yang didukung, konstruktor non-publik dan tanpa parameter tidak lagi digunakan untuk deserialisasi dengan JsonSerializer, secara default.

Deskripsi perubahan

Paket NuGet System.Text.Json mandiri yang mendukung .NET Standard 2.0 dan yang lebih tinggi, yaitu versi 4.6.0-4.7.2, bereaksi tidak konsisten dengan perilaku bawaan pada .NET Core 3.0 dan 3.1. Pada .NET Core 3.x, konstruktor internal dan privat dapat digunakan untuk deserialisasi. Dalam paket mandiri, konstruktor non-publik tidak diizinkan, dan MissingMethodException dilemparkan jika tidak ada konstruktor publik tanpa parameter yang ditentukan.

Dimulai dengan paket NuGet .NET 5 dan System.Text.Json 5.0.0, perilakunya konsisten antara paket NuGet dan API bawaan. Konstruktor non-publik, termasuk konstruktor tanpa parameter, diabaikan oleh serializer secara default. Serializer menggunakan salah satu konstruktor berikut untuk deserialisasi:

  • Konstruktor publik dianotasikan dengan JsonConstructorAttribute.
  • Konstruktor tanpa parameter publik.
  • Konstruktor berparameter publik (jika itu satu-satunya konstruktor publik yang ada).

Jika tidak ada konstruktor ini yang tersedia, akan NotSupportedException dilemparkan jika Anda mencoba mendeserialisasi jenisnya.

Versi yang diperkenalkan

5.0

Alasan untuk berubah

  • Untuk menerapkan perilaku yang konsisten antara semua moniker kerangka kerja target (TFM) yang System.Text.Json membangun untuk (.NET Core 3.0 dan versi yang lebih baru dan .NET Standard 2.0)
  • Karena JsonSerializer tidak boleh memanggil area permukaan non-publik dari jenis, baik itu konstruktor, properti, atau bidang.
  • Jika Anda memiliki jenis dan layak, buat konstruktor tanpa parameter publik.
  • Jika tidak, terapkan JsonConverter<T> untuk jenis dan kontrol perilaku deserialisasi. Anda dapat memanggil konstruktor non-publik dari JsonConverter<T> implementasi jika aturan aksesibilitas C# untuk skenario tersebut mengizinkannya.

API yang Terpengaruh