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.
- desenini
.ctor(SerializationInfo, StreamingContext)
izleyen tüm genel veya korumalı serileştirme oluşturucuları. Böyle bir oluşturucuya örnek olarak .Exception(SerializationInfo, StreamingContext) - yönteminin ISerializable.GetObjectData(SerializationInfo, StreamingContext) tüm örtük uygulamaları, örneğin, System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- yönteminin IObjectReference.GetRealObject(StreamingContext) tüm örtük uygulamaları, örneğin, System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
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 veGetObjectData
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ızSYSLIB0051
, ö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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin