CA2237: ISerializable türleri SerializableAttribute ile işaretleyin
Özellik | Değer |
---|---|
Kural Kimliği | CA2237 |
Başlık | ISerializable türleri SerializableAttribute ile işaretleyin |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Dışarıdan görünen bir tür arabirimi uygular System.Runtime.Serialization.ISerializable ve tür özniteliğiyle System.SerializableAttribute işaretlenmez. Kural, temel türü serileştirilebilir olmayan türetilmiş türleri yoksayar.
Kural açıklaması
Ortak dil çalışma zamanı tarafından serileştirilebilir olarak tanınması için, tür arabiriminin SerializableAttribute uygulanması aracılığıyla özel bir serileştirme yordamı kullansa bile türlerin ISerializable özniteliğiyle işaretlenmesi gerekir.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için özniteliğini SerializableAttribute türüne uygulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Uygulama etki alanları arasında düzgün çalışabilmeleri için serileştirilebilir olmaları gerektiğinden, özel durum sınıfları için bu kuraldan gelen bir uyarıyı gizlemeyin.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte kuralı ihlal eden bir tür gösterilmektedir. SerializableAttribute Kuralı karşılamak için öznitelik satırının açıklamasını kaldırın.
Imports System.Runtime.Serialization
Namespace ca2237
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New(
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
Overridable Sub GetObjectData(
info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}