CA2239: Provide deserialization methods for optional fields


The new home for Visual Studio documentation is Visual Studio 2017 Documentation on

The latest version of this topic can be found at CA2239: Provide deserialization methods for optional fields.

|Breaking Change|Non Breaking|

A type has a field that is marked with the System.Runtime.Serialization.OptionalFieldAttribute attribute and the type does not provide de-serialization event handling methods.

The OptionalFieldAttribute attribute has no effect on serialization; a field marked with the attribute is serialized. However, the field is ignored on de-serialization and retains the default value associated with its type. De-serialization event handlers should be declared to set the field during the de-serialization process.

To fix a violation of this rule, add de-serialization event handling methods to the type.

It is safe to suppress a warning from this rule if the field should be ignored during the de-serialization process.

The following example shows a type with an optional field and de-serialization event handling methods.

using System;
using System.Reflection;
using System.Runtime.Serialization;

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

      void OnDeserializing(StreamingContext context)
         optionalField = 5;

      void OnDeserialized(StreamingContext context)
         // Set optionalField if dependent on other deserialized values.

CA2236: Call base class methods on ISerializable types

CA2240: Implement ISerializable correctly

CA2229: Implement serialization constructors

CA2238: Implement serialization methods correctly

CA2235: Mark all non-serializable fields

CA2237: Mark ISerializable types with SerializableAttribute

CA2120: Secure serialization constructors