CA2229: serialization 생성자를 구현하십시오.
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 아님 |
원인
ISerializable 인터페이스를 구현하는 형식이 대리자나 인터페이스가 아니고 다음 조건 중 하나에 해당합니다.
형식에 SerializationInfo 개체 및 StreamingContext 개체(serialization 생성자의 시그니처)를 사용하는 생성자가 없는 경우
형식이 unsealed이고 해당 serialization 생성자에 대한 액세스 한정자가 protected가 아닌 경우(패밀리)
형식이 sealed이고 해당 serialization 생성자에 대한 액세스 한정자가 private이 아닌 경우
규칙 설명
이 규칙은 사용자 지정 serialization을 지원하는 형식과 관련이 있습니다.형식이 ISerializable 인터페이스를 구현할 경우 이 형식은 사용자 지정 serialization을 지원합니다.ISerializable.GetObjectData 메서드를 사용하여 serialize된 개체를 다시 만들거나 deserialize하려면 serialization 생성자가 필요합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 serialization 생성자를 구현합니다.봉인 클래스의 경우에는 생성자를 private으로 만들고, 그 밖의 경우에는 protected로 만듭니다.
경고를 표시하지 않는 경우
규칙 위반을 표시해야 합니다.형식을 deserialize할 수 없으므로 많은 시나리오에서 동작하지 않게 됩니다.
예제
다음 예제에서는 이 규칙을 만족하는 형식을 보여 줍니다.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
namespace UsageLibrary
{
[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 = (int) info.GetValue("n1", typeof(int));
}
// The following method serializes the instance.
[SecurityPermission(SecurityAction.LinkDemand,
Flags=SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("n1", n1);
}
}
}
관련 규칙
CA2237: ISerializable 형식을 SerializableAttribute로 표시하십시오.