CA2237: Tipos de ISerializable de marca com o SerializableAttribute
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
Um tipo visível externamente implementa o System.Runtime.Serialization.ISerializable interface e o tipo não está marcado com o System.SerializableAttribute atributo. A regra ignora os tipos derivados cujo tipo base não é serializável.
Descrição da regra
Para ser reconhecido pelo common language runtime como serializável, os tipos devem ser marcados com o SerializableAttribute atributo mesmo se o tipo usa uma rotina de serialização personalizada por meio da implementação da ISerializable interface.
Como corrigir violações
Para corrigir uma violação desta regra, aplicar o SerializableAttribute atributo para o tipo.
Quando suprimir avisos
Não suprimir um aviso da regra para classes de exceção como deve ser serializáveis para funcionar corretamente em domínios de aplicativo.
Exemplo
O exemplo a seguir mostra um tipo que viola a regra. Descomente a SerializableAttribute a linha de atributo para satisfazer a regra.
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);
}
}
}
Regras relacionadas
CA2236: Chamar métodos da classe base nos tipos de ISerializable
CA2240: Implementa ISerializable corretamente
CA2229: Implementar os construtores de serialização
CA2238: Implementar métodos de serialização corretamente
CA2235: Marcar todos os campos não serializáveis
CA2239: Fornecer métodos de desserialização de campos opcionais