Bagikan melalui


SYSLIB0051: API dukungan serialisasi warisan sudah usang

Jenis API berikut usang, mulai dari .NET 8. Memanggilnya dalam kode menghasilkan peringatan SYSLIB0051 pada waktu kompilasi.

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 GetObjectData metode serialisasi Anda sendiri menggunakan SYSLIB0051 kode 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 #if pernyataan 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 mendapatkan SYSLIB0051 peringatan, 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.

Lihat juga