CA2229: serialization 생성자를 구현하십시오.
속성 | 값 |
---|---|
규칙 ID | CA2229 |
제목 | serialization 생성자를 구현하십시오. |
범주 | 사용 현황 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
참고 항목
이 규칙은 SYSLIB0051 충돌 하므로 .NET 8에서 제거되었습니다. 레거시 serialization 지원 API는 사용되지 않습니다.
원인
형식은 System.Runtime.Serialization.ISerializable 인터페이스를 구현하고 대리자 또는 인터페이스가 아니며 다음 조건 중 하나에 해당합니다.
형식에는 SerializationInfo 개체 및 StreamingContext 개체(serialization 생성자의 시그니처)를 사용하는 생성자가 없습니다.
형식이 봉인되지 않고 serialization 생성자의 액세스 한정자가 보호되지 않습니다(family).
형식이 봉인되지 않고 serialization 생성자의 액세스 한정자가 private이 아닙니다.
규칙 설명
이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다. ISerializable 인터페이스를 구현하는 경우 형식이 사용자 지정 serialization을 지원합니다. serialization 생성자는 ISerializable.GetObjectData 메서드를 사용하여 직렬화된 개체를 역직렬화하거나 다시 만드는 데 필요합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다. 봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다.
경고를 표시하지 않는 경우
이 규칙 위반을 표시해야 합니다. 형식은 역직렬화할 수 없으며 여러 시나리오에서 작동하지 않습니다.
예시
다음 예제에서는 규칙을 충족하는 형식을 보여 줍니다.
[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
private int n1;
// This is a regular constructor.
public SerializationConstructorsRequired()
{
n1 = -1;
}
// This is the serialization constructor.
// Satisfies rule: ImplementSerializationConstructors.
protected SerializationConstructorsRequired(
SerializationInfo info,
StreamingContext context)
{
n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
(int)info.GetValue(nameof(n1), typeof(int))! :
-1;
}
// The following method serializes the instance.
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue(nameof(n1), n1);
}
}
관련 규칙
CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.
참고 항목
.NET