CA2239: 선택적 필드에 deserialization 메서드를 제공하십시오.
TypeName |
ProvideDeserializationMethodsForOptionalFields |
CheckId |
CA2239 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 아님 |
원인
형식에 System.Runtime.Serialization.OptionalFieldAttribute 특성으로 표시된 필드가 있으며 형식에서 deserialization 이벤트 처리 메서드를 제공하지 않습니다.
규칙 설명
OptionalFieldAttribute 특성은 serialization에 영향을 주지 않습니다. 이 특성으로 표시된 필드는 serialize됩니다. 하지만 deserialization에서는 이 필드가 무시되어 해당 형식과 연관된 기본값을 유지합니다. deserialization 프로세스 도중 필드를 설정하려면 deserialization 이벤트 처리기를 선언해야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 형식에 deserialization 이벤트 처리 메서드를 추가합니다.
경고를 표시하지 않는 경우
deserialization 프로세스 도중 필드를 무시해야 하는 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.
예제
다음 예제에서는 선택적 필드와 deserialization 이벤트 처리 메서드가 있는 형식을 보여 줍니다.
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: serialization 생성자를 구현하십시오.
CA2238: serialization 메서드를 올바르게 구현하십시오.
CA2235: 모두 serialize할 수 없는 필드로 표시하십시오.