CA2237:必須以 SerializableAttribute 標記 ISerializable 型別

型別名稱

MarkISerializableTypesWithSerializable

CheckId

CA2237

分類

Microsoft.Usage

中斷變更

不中斷

原因

外部可見的型別會實作 System.Runtime.Serialization.ISerializable 介面,而且型別並未以 System.SerializableAttribute 屬性 (Attribute) 標記。此規則會忽略基底型別 (Base Type) 未序列化的衍生型別 (Derived Type)。

規則描述

若要讓 Common Language Runtime 辨認為可序列化,即使型別透過 ISerializable 介面的實作使用自訂序列化常式,型別仍必須以 SerializableAttribute 屬性標記。

如何修正違規

若要修正此規則的違規情形,請將 SerializableAttribute 屬性套用到型別。

隱藏警告的時機

請勿針對例外狀況 (Exception) 類別 (Class) 隱藏此規則的警告,因為這些類別必須為可序列化,才能在不同的應用程式定義域上正常運作。

範例

下列範例顯示違反規則的型別。取消註解 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:必須保護序列化建構函式