共用方式為


CA2239:必須為選擇性欄位提供還原序列化方法

型別名稱

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

分類

Microsoft.Usage

中斷變更

不中斷

原因

型別具有以 OptionalFieldAttribute 屬性 (Attribute) 標示的欄位,而且型別不提供還原序列化 (Deserialization) 事件處理方法。

規則描述

OptionalFieldAttribute 屬性對於序列化 (Serialization) 沒有作用,而以屬性標示的欄位會序列化。然而,在還原序列化時會忽略欄位,而且這個欄位會保留與型別相關聯的預設值。還原序列化事件處理常式應該宣告為在還原序列化處理期間設定欄位。

如何修正違規

若要修正此規則的違規情形,請將還原序列化事件處理方法加入至型別。

隱藏警告的時機

如果在還原序列化處理期間應該忽略欄位,則您可以放心地隱藏這項規則的警告。

範例

下列範例會顯示含選擇性欄位的型別和還原序列化事件處理方法。

Imports System
Imports System.Reflection
Imports System.Runtime.Serialization

<Assembly: AssemblyVersionAttribute("2.0.0.0")>
Namespace UsageLibrary

   <SerializableAttribute> _ 
   Public Class SerializationEventHandlers

      <OptionalFieldAttribute(VersionAdded := 2)> _ 
      Dim optionalField As Integer = 5

      <OnDeserializingAttribute> _ 
      Private Sub OnDeserializing(context As StreamingContext)
         optionalField = 5
      End Sub

      <OnDeserializedAttribute> _ 
      Private Sub OnDeserialized(context As StreamingContext)
         ' Set optionalField if dependent on other deserialized values. 
      End Sub 

   End Class 

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

[assembly: AssemblyVersionAttribute("2.0.0.0")]
namespace UsageLibrary
{
   [SerializableAttribute]
   public class SerializationEventHandlers
   {
      [OptionalFieldAttribute(VersionAdded = 2)]
      int optionalField = 5;

      [OnDeserializingAttribute]
      void OnDeserializing(StreamingContext context)
      {
         optionalField = 5;
      }

      [OnDeserializedAttribute]
      void OnDeserialized(StreamingContext context)
      {
         // Set optionalField if dependent on other deserialized values.
      }
   }
}

相關規則

CA2236:必須呼叫 ISerializable 類型上的基底類別方法

CA2240:必須正確實作 ISerializable

CA2229:請實作序列化建構函式

CA2238:請正確實作序列化方法

CA2235:必須標記所有不可序列化的欄位

CA2237:必須以 SerializableAttribute 標記 ISerializable 類型

CA2120:必須保護序列化建構函式