Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jenis API berikut usang, mulai dari .NET 8. Memanggilnya dalam kode menghasilkan peringatan SYSLIB0051 pada waktu kompilasi.
- Semua konstruktor serialisasi publik atau terlindungi yang mengikuti pola
.ctor(SerializationInfo, StreamingContext). Contoh konstruktor seperti itu adalah Exception(SerializationInfo, StreamingContext). - Semua implementasi implisit dari metode ini ISerializable.GetObjectData(SerializationInfo, StreamingContext) , misalnya, System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- Semua implementasi implisit dari metode ini IObjectReference.GetRealObject(StreamingContext) , misalnya, System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
Untuk daftar lengkap API yang terpengaruh, lihat API Usang - SYSLIB0051.
Solusi Sementara
Jika Anda membuat jenis kustom yang berasal dari System.Exception, pertimbangkan apakah Anda benar-benar membutuhkannya untuk dapat diserialisasikan. Kemungkinan Anda tidak memerlukannya untuk dapat diserialisasikan, karena serialisasi pengecualian terutama dimaksudkan untuk mendukung jarak jauh, dan dukungan untuk jarak jauh dihilangkan di .NET Core 1.0.
Jika jenis pengecualian kustom Anda didefinisikan seperti yang ditunjukkan dalam cuplikan kode berikut, cukup hapus
[Serializable]atribut, konstruktor serialisasi, dan penimpaan GetObjectData(SerializationInfo, StreamingContext) metode.[Serializable] // Remove this attribute. public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } // Remove this constructor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } // Remove this method. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }Mungkin ada kasus di mana Anda tidak dapat menghapus API ini dari jenis pengecualian kustom Anda, misalnya, jika Anda menghasilkan pustaka yang dibatasi oleh persyaratan kompatibilitas API. Dalam hal ini, rekomendasinya adalah untuk mengusir konstruktor dan
GetObjectDatametode serialisasi Anda sendiri menggunakanSYSLIB0051kode diagnostik, seperti yang ditunjukkan dalam kode berikut. Karena idealnya tidak ada orang di luar infrastruktur serialisasi itu sendiri yang harus memanggil API ini, keusangan hanya boleh berdampak pada jenis lain yang mensubkelas jenis pengecualian kustom Anda. Seharusnya tidak berdampak viral pada siapa pun yang menangkap, membangun, atau menggunakan jenis pengecualian kustom Anda.[Serializable] public class MyException : Exception { public MyException() { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor. protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData. public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }Jika Anda menargetkan silang untuk .NET Framework dan .NET 8+, Anda dapat menggunakan
#ifpernyataan untuk menerapkan kedaluarsa secara kondisional. Ini adalah strategi yang sama dengan yang digunakan tim .NET dalam basis kode pustaka .NET saat runtime penargetan silang.[Serializable] public class MyException : Exception { // ... #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor #endif protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // ... } #if NET8_0_OR_GREATER [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData #endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { // ... base.GetObjectData(info, context); } }Jika Anda telah mendeklarasikan jenis yang mensubkelas jenis .NET yang dikaitkan dengan
[Serializable]dan Anda mendapatkanSYSLIB0051peringatan, ikuti panduan untuk jenis pengecualian kustom di poin sebelumnya.
Tip
Jika jenis kustom Anda [Serializable] tidak mensubkelas jenis .NET, Anda tidak akan melihat SYSLIB0051 peringatan. Namun, kami sarankan untuk tidak menganotasi jenis Anda dengan cara ini, karena pustaka serialisasi modern seperti System.Text.Json tidak memerlukannya. Pertimbangkan untuk menghapus [Serializable] atribut dan ISerializable antarmuka. Sebagai gantinya, mengandalkan pustaka serialisasi Anda untuk mengakses objek jenis melalui properti publiknya daripada bidang privatnya.
Menyembunyikan peringatan
Jika Anda harus menggunakan API usang, Anda dapat menekan peringatan dalam kode atau dalam file proyek Anda.
Untuk menekan hanya satu pelanggaran, tambahkan direktif praprosedur ke file sumber Anda untuk menonaktifkan lalu mengaktifkan kembali peringatan.
// Disable the warning.
#pragma warning disable SYSLIB0051
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0051
Untuk menekan semua SYSLIB0051 peringatan dalam proyek Anda, tambahkan <NoWarn> properti ke file proyek Anda.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
</PropertyGroup>
</Project>
Untuk informasi selengkapnya, lihat Menyembunyikan peringatan.