Aracılığıyla paylaş


SYSLIB0051: Eski serileştirme desteği API'leri kullanımdan kaldırıldı

.NET 8'den başlayarak aşağıdaki API türleri eskidir. Bunları kodda çağırmak, derleme zamanında uyarı SYSLIB0051 oluşturur.

Etkilenen API'lerin tam listesi için bkz . Eski API'ler - SYSLIB0051.

Geçici çözüm

  • 'den System.Exceptiontüretilmiş bir özel tür oluşturduysanız, gerçekten seri hale getirilebilir olması gerekip gerekmediğini göz önünde bulundurun. Büyük olasılıkla seri hale getirilebilir olması gerekmez çünkü özel durum serileştirme öncelikli olarak uzaktan iletişimi desteklemeye yöneliktir ve uzaktan iletişim desteği .NET Core 1.0'a bırakılmıştı.

    Özel özel durum türünüz aşağıdaki kod parçacığında gösterilen gibi tanımlanmışsa özniteliğini, serileştirme oluşturucuyu ve yöntemi geçersiz kılmayı GetObjectData(SerializationInfo, StreamingContext) kaldırmanız [Serializable] yeterlidir.

    [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);
        }
    }
    

    Örneğin API uyumluluk gereksinimleriyle kısıtlanmış bir kitaplık oluşturursanız, bu API'leri özel özel durum türünüzden kaldıramayabilirsiniz. Bu durumda, aşağıdaki kodda gösterildiği gibi tanılama kodunu kullanarak SYSLIB0051 kendi serileştirme oluşturucunuzu ve GetObjectData yöntemlerinizi kullanımdan kaldırmanız önerilmektedir. İdeal olarak serileştirme altyapısı dışındaki hiç kimse bu API'leri çağırmadığından, kullanımdan kaldırılma yalnızca özel özel durum türünüzü alt sınıfa alan diğer türleri etkilemelidir. Özel özel durum türünüzü yakalayan, oluşturan veya başka bir şekilde kullanan herkesi viral olarak etkilememelidir.

    [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);
        }
    }
    

    .NET Framework ve .NET 8+ için çapraz hedef oluşturursanız, kullanımdan kaldırılmış sürümü koşullu olarak uygulamak için bir #if deyimi kullanabilirsiniz. Bu, çalışma zamanları çapraz hedeflenirken .NET ekibinin .NET kitaplıkları kod tabanında kullandığı stratejiyle aynıdır.

    [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);
        }
    }
    
    
  • Öznitelikli [Serializable] bir .NET türünün alt sınıfını oluşturan bir tür bildirdiyseniz ve uyarılar alıyorsanız SYSLIB0051 , önceki madde işareti noktasındaki özel özel durum türleri için kılavuzu izleyin.

İpucu

Özel türünüz [Serializable] .NET türünün alt sınıfını oluşturmuyorsa uyarı görmezsiniz SYSLIB0051 . Ancak, gibi System.Text.Json modern serileştirme kitaplıkları bunları gerektirmediğinden, türünüz için bu şekilde açıklama eklemenizi öneririz. özniteliğini [Serializable] ve arabirimini kaldırmayı ISerializable göz önünde bulundurun. Bunun yerine, türün nesnelerine özel alanları yerine ortak özellikleri aracılığıyla erişmek için serileştirme kitaplığınızı kullanın.

Uyarıyı gizleme

Eski API'leri kullanmanız gerekiyorsa, uyarıyı kodda veya proje dosyanızda gizleyebilirsiniz.

Yalnızca tek bir ihlali engellemek için, önişlemci yönergelerini kaynak dosyanıza ekleyerek uyarıyı devre dışı bırakın ve sonra yeniden etkinleştirin.

// Disable the warning.
#pragma warning disable SYSLIB0051

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0051

Projenizdeki tüm SYSLIB0051 uyarıları engellemek için proje dosyanıza bir <NoWarn> özellik ekleyin.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
  </PropertyGroup>
</Project>

Daha fazla bilgi için bkz . Uyarıları gizleme.

Ayrıca bkz.