Поделиться через


CA2237: пометьте типы ISerializable атрибутом SerializableAttribute

TypeName

MarkISerializableTypesWithSerializable

CheckId

CA2237

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Доступный для внешнего кода тип реализует интерфейс System.Runtime.Serialization.ISerializable, однако тип не помечен атрибутом System.SerializableAttribute. Согласно данному правилу, типы, производные от несериализуемого базового типа, пропускаются.

Описание правила

Чтобы среда CLR распознавала тип как сериализуемый, он должен быть помечен атрибутом SerializableAttribute даже в том случае, если тип использует пользовательскую процедуру сериализации посредством реализации интерфейса ISerializable.

Устранение нарушений

Чтобы устранить нарушение данного правила, примените к типу атрибут SerializableAttribute.

Отключение предупреждений

Не следует отключать предупреждение о нарушении данного правила для классов исключений, поскольку дли правильной работы в доменах приложений эти классы должны быть сериализуемыми.

Пример

В следующем примере показан тип, который нарушает данное правило. Чтобы устранить нарушение правила, снимите метку комментария со строки атрибута SerializableAttribute.

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);
      }
   }
}

Связанные правила

CA2236: вызывайте методы базового класса для типов ISerializable

CA2240: правильно реализуйте ISerializable

CA2229: применяйте конструкторы сериализации

CA2238: следует правильно реализовывать методы сериализации

CA2235: помечайте все несериализуемые поля

CA2239: предоставляйте методы десериализации для необязательных полей

CA2120: обеспечьте безопасность конструкторов сериализации