Предоставляйте методы десериализации для необязательных полей
Обновлен: Ноябрь 2007
TypeName |
ProvideDeserializationMethodsForOptionalFields |
CheckId |
CA2239 |
Категория |
Microsoft.Usage |
Критическое изменение |
Не критическое |
Причина
Тип имеет поле с атрибутом System.Runtime.Serialization.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.
}
}
}
Связанные правила
Вызывайте методы базового класса для типов ISerializable
Правильно реализуйте ISerializable
Применяйте конструкторы сериализации
Правильно реализовывать методы сериализации
Помечайте все несериализуемые поля
Помечайте типы ISerializable атрибутом SerializableAttribute