CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
Kategoria |
Microsoft.Usage |
Złamanie zmiany |
Bez podziału |
Przyczyna
Typ widocznych zewnętrznie implementuje ISerializable interfejs i typ nie jest oznaczony atrybutem SerializableAttribute atrybut.Reguła ignoruje Typy pochodne, którego typ podstawowy nie jest możliwy do serializacji.
Opis reguły
Rozpoznane przez aparatu plików wykonywalnych języka wspólnego jako możliwy do serializacji, muszą być oznaczone typów SerializableAttribute atrybutu, nawet jeśli typ korzysta z rutynowych serializacji niestandardowej poprzez wdrażanie ISerializable interfejsu.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, stosuje się SerializableAttribute atrybut typu.
Kiedy do pomijania ostrzeżenia
Nie pomijaj ostrzeżenie od tej reguły dla klas wyjątków, ponieważ musi być możliwy do serializacji działało poprawnie, domenach aplikacji.
Przykład
Poniższy przykład pokazuje typ, który narusza reguły.Usuń oznaczenie komentarza SerializableAttribute atrybutu linii, aby spełnić wymagań reguły.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
' <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
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
}
Zasady pokrewne
CA2236: Wywołanie metod klasy podstawowej typu ISerializable
CA2240: Należy poprawnie zaimplementować ISerializable
CA2229: Należy zaimplementować konstruktory serializacji
CA2238: Należy poprawnie zaimplementować metody serializacji
CA2235: Należy oznaczyć wszystkie nieserializowane pola