CA2239: Zapewnić deserialization metody pola opcjonalne
TypeName |
ProvideDeserializationMethodsForOptionalFields |
CheckId |
CA2239 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ ma pole oznaczone przez atrybut System.Runtime.Serialization.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 metody klasy bazowej typy ISerializable
CA2240: Wdrożenie ISerializable poprawnie
CA2229: Konstruktory serializacji wdrożenie
CA2238: Prawidłowo zaimplementować Serializacja metod
CA2235: Oznaczyć wszystkie pola nie można serializować