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


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

TypeName

CallBaseClassMethodsOnISerializableTypes

CheckId

CA2236

Категория

Microsoft.Usage

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

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

Причина

Тип происходит от типа, реализующего интерфейс ISerializable, при этом выполняется одно из следующих условий:

  • Тип реализует конструктор сериализации, то есть сигнатурой параметров SerializationInfo, StreamingContext, но не вызывает конструктор сериализации базового типа.

  • Тип реализует метод ISerializable.GetObjectData, но не вызывает метод GetObjectData базового типа.

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

В настраиваемом процессе сериализации тип реализует метод GetObjectData для сериализации своих полей и конструктор сериализации для отмены сериализации полей.Если тип происходит от типа, реализующего интерфейс ISerializable, то нужно вызывать метод базового типа GetObjectData и конструктор сериализации для сериализации и отмены сериализации полей базового типа.В противном сериализация и отмена сериализации типа не будут выполнены правильно.Обратите внимание, что если в производном типе не добавляются никакие новые поля, тип не должен реализовывать метод GetObjectData или конструктор сериализации и не должен вызывать эквиваленты базового типа.

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

Чтобы устранить нарушение этого правила, вызовите метод базового типа GetObjectData или конструктор сериализации из соответствующего метода типа или конструктора.

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

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан производный тип, соответствующий правилу благодаря вызову конструктора сериализации и метода базового класса GetObjectData.

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

   <SerializableAttribute> _ 
   Public Class DerivedType: Inherits BaseType

      Dim derivedValue As Integer 

      Sub New()
         derivedValue = 4
      End Sub 

      Protected Sub New( _ 
         info As SerializationInfo, context As StreamingContext)

         MyBase.New(info, context)      
         derivedValue = info.GetInt32("derivedValue")

      End Sub

      <SecurityPermissionAttribute(SecurityAction.Demand, _ 
          SerializationFormatter := True)> _ 
      Overrides Sub GetObjectData( _ 
         info As SerializationInfo, context As StreamingContext)

         info.AddValue("derivedValue", derivedValue)
         MyBase.GetObjectData(info, context)

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

   [SerializableAttribute]
   public class DerivedType : BaseType
   {
      int derivedValue;

      public DerivedType()
      {
         derivedValue = 4;
      }

      protected DerivedType(
         SerializationInfo info, StreamingContext context) : 
         base(info, context)
      {
         derivedValue = info.GetInt32("derivedValue");
      }

      [SecurityPermissionAttribute(SecurityAction.Demand, 
          SerializationFormatter = true)]
      public override void GetObjectData(
         SerializationInfo info, StreamingContext context)
      {
         info.AddValue("derivedValue", derivedValue);
         base.GetObjectData(info, context);
      }
   }
}

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

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

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

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

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

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

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

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