| 속성 | 값 |
|---|---|
| 규칙 ID | CA2237 |
| 제목 | SerializableAttribute로 ISerializable 형식 표시 |
| 범주 | 사용 현황 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 아니요 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
외부에 표시되는 형식이 System.Runtime.Serialization.ISerializable 인터페이스를 구현하고 형식이 System.SerializableAttribute 특성으로 표시되지 않습니다. 규칙은 기본 형식이 직렬화 가능하지 않은 파생 형식을 무시합니다.
규칙 설명
공용 언어 런타임에서 직렬화가 가능하다고 인식되려면 형식이 SerializableAttribute 인터페이스 구현을 통해 사용자 지정 serialization 루틴을 사용하는 경우에도 ISerializable 특성을 사용하여 형식을 표시해야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 형식에 SerializableAttribute 특성을 적용합니다.
경고를 표시하지 않는 경우
애플리케이션 도메인에서 올바르게 작동하려면 직렬화할 수 있어야 하므로 예외 클래스에 대한 이 규칙의 경고를 표시하지 마세요.
경고 표시 안 함
단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 구성 파일에서 none의 심각도를 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
예시
다음 예제에서는 규칙을 위반하는 형식을 보여 줍니다. 규칙을 충족하려면 SerializableAttribute 특성 줄의 주석 처리를 제거합니다.
Imports System.Runtime.Serialization
Namespace ca2237
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New(
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
Overridable Sub GetObjectData(
info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
관련 규칙
.NET