CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2237 |
Tytuł | Oznacz typy ISerializable atrybutem SerializableAttribute |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Typ widoczny zewnętrznie implementuje System.Runtime.Serialization.ISerializable interfejs, a typ nie jest oznaczony atrybutem System.SerializableAttribute . Reguła ignoruje typy pochodne, których typ podstawowy nie można serializować.
Opis reguły
Aby można było rozpoznać przez środowisko uruchomieniowe języka wspólnego jako możliwe do serializacji, typy muszą być oznaczone atrybutem SerializableAttribute , nawet jeśli typ używa niestandardowej procedury serializacji za pomocą implementacji interfejsu ISerializable .
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zastosuj SerializableAttribute atrybut do typu.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżenia z tej reguły dla klas wyjątków, ponieważ muszą one być serializowalne, aby działały poprawnie w domenach aplikacji.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie pokazano typ, który narusza regułę. Usuń komentarz z wiersza atrybutu SerializableAttribute , aby spełnić regułę.
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);
}
}