CA2239: Dostarcz metody deserializacji pól opcjonalnych
TypeName |
ProvideDeserializationMethodsForOptionalFields |
CheckId |
CA2239 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ ma pole oznaczone przez atrybut OptionalFieldAttribute i nie zapewnia metod obsługi zdarzeń deserializacji.
Opis reguły
Atrybut OptionalFieldAttribute nie ma wpływu na serializację; pola oznaczone atrybutem jest serializowane.Jednak, pole jest ignorowane przy deserializacji i zachowuje domyślną wartość skojarzoną z jego typem.Obsługa zdarzenia deserializacji powinna być zadeklarowana tak, aby ustawiać wartość tego pola podczas procesu deserializacji.
Jak naprawić naruszenia
Ustalenie naruszenie tej zasady, należy dodać metody obsług zdarzenia deserializacji do typu.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli pole ma być zignorowane podczas procesu deserializacji.
Przykład
Poniższy przykład pokazuje typ z opcjonalnym polem i metody obsługi zdarzeń deserializacji.
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.
}
}
}
Powiązane reguły
CA2236: Wywołanie metod klasy podstawowej typu ISerializable
CA2240: Należy poprawnie zaimplementować ISerializable
CA2229: Należy zaimplementować konstruktory serializacji
CA2238: Należy poprawnie zaimplementować metody serializacji
CA2235: Należy oznaczyć wszystkie nieserializowane pola
CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute