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


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

Обновлен: Ноябрь 2007

TypeName

MarkAllNonSerializableFields

CheckId

CA2235

Категория

Microsoft.Usage

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

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

Причина

Экземпляр поля несериализуемого типа объявлен в сериализуемом типе.

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

Сериализуемый тип — это тип, помеченный атрибутом System.SerializableAttribute. При сериализации этого типа возникает исключение System.Runtime.Serialization.SerializationException, если тип содержит поле экземпляра несериализуемого типа.

Предотвращение нарушений

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

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

Отключать предупреждения этого правила следует только при объявлении типа System.Runtime.Serialization.ISerializationSurrogate, позволяющего сериализовать и десериализовать экземпляры поля.

Пример

В следующем примере демонстрируется тип, нарушающий это правило, и тип, соответствующий этому правилу.

Imports System
Imports System.Runtime.Serialization

Namespace UsageLibrary

   Public Class Mouse

      Dim buttons As Integer
      Dim scanTypeValue As String

      ReadOnly Property NumberOfButtons As Integer
         Get
            Return buttons
         End Get
      End Property

      ReadOnly Property ScanType As String
         Get
            Return scanTypeValue
         End Get
      End Property

      Sub New(numberOfButtons As Integer, scanType As String)
         buttons = numberOfButtons
         scanTypeValue = scanType
      End Sub

   End Class

   <SerializableAttribute> _ 
   Public Class InputDevices1

      ' Violates MarkAllNonSerializableFields.
      Dim opticalMouse As Mouse 

      Sub New()
         opticalMouse = New Mouse(5, "optical") 
      End Sub

   End Class

   <SerializableAttribute> _ 
   Public Class InputDevices2

      ' Satisfies MarkAllNonSerializableFields.
      <NonSerializedAttribute> _ 
      Dim opticalMouse As Mouse 

      Sub New()
         opticalMouse = New Mouse(5, "optical") 
      End Sub

   End Class

End Namespace
using System;
using System.Runtime.Serialization;

namespace UsageLibrary
{
   public class Mouse
   {
      int buttons;
      string scanTypeValue;

      public int NumberOfButtons
      {
         get { return buttons; }
      }

      public string ScanType
      {
         get { return scanTypeValue; }
      }

      public Mouse(int numberOfButtons, string scanType)
      {
         buttons = numberOfButtons;
         scanTypeValue = scanType;
      }
   }

   [SerializableAttribute]
   public class InputDevices1
   {
      // Violates MarkAllNonSerializableFields.
      Mouse opticalMouse;

      public InputDevices1()
      {
         opticalMouse = new Mouse(5, "optical"); 
      }
   }

   [SerializableAttribute]
   public class InputDevices2
   {
      // Satisfies MarkAllNonSerializableFields.
      [NonSerializedAttribute]
      Mouse opticalMouse;

      public InputDevices2()
      {
         opticalMouse = new Mouse(5, "optical"); 
      }
   }
}

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

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

Правильно реализуйте ISerializable

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

Правильно реализовывать методы сериализации

Помечайте типы ISerializable атрибутом SerializableAttribute

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

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