Udostępnij za pośrednictwem


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

CA2239: Dostarcz metody deserializacji pól opcjonalnych

CA2120: Zabezpieczaj konstruktory serializacji