CA2239: предоставляйте методы десериализации для необязательных полей
TypeName |
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: пометьте типы ISerializable атрибутом SerializableAttribute