CA2239:为可选字段提供反序列化方法

类型名

ProvideDeserializationMethodsForOptionalFields

CheckId

CA2239

类别

Microsoft.Usage

是否重大更改

原因

类型有一个使用 OptionalFieldAttribute 特性标记的字段,并且该类型没有提供反序列化事件处理方法。

规则说明

OptionalFieldAttribute 特性对序列化没有影响;用该特性标记的字段已序列化。但是,反序列化时该字段将被忽略,并保留与其类型关联的默认值。应当声明反序列化事件处理程序,以便在反序列化过程中设置该字段。

如何解决冲突

要修复与该规则的冲突,请为该类型添加反序列化事件处理方法。

何时禁止显示警告

如果应在反序列化过程中忽略该字段,则可以安全地禁止显示此规则发出的警告。

示例

下面的示例演示带有可选字段和反序列化事件处理方法的类型。

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:保护序列化构造函数