CA2229: シリアル化コンストラクターを実装します
TypeName |
ImplementSerializationConstructors |
CheckId |
CA2229 |
分類 |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
ISerializable インターフェイスを実装している型が、デリゲートでもインターフェイスでもなく、次の条件のいずれかに当てはまります。
この型に、SerializationInfo オブジェクトと StreamingContext オブジェクト (シリアル化コンストラクターのシグネチャ) を使用するコンストラクターがありません。
この型はシールされていません。またシリアル化コンストラクターのアクセス修飾子が保護されていません (ファミリではありません)。
この型はシールされています。またシリアル化コンストラクターのアクセス修飾子がプライベートではありません。
規則の説明
この規則は、カスタムのシリアル化をサポートする型に関係があります。型で ISerializable インターフェイスを実装する場合、カスタムのシリアル化がサポートされます。シリアル化コンストラクターは、ISerializable.GetObjectData メソッドを使用してシリアル化されたオブジェクトの逆シリアル化、または再作成に必要です。
違反の修正方法
この規則違反を修正するには、シリアル化コンストラクターを実装します。シールされたクラスの場合、コンストラクターをプライベートにするか、プロテクトにします。
警告を抑制する状況
この規則の警告は抑制しないでください。このような型は逆シリアル化できません。また多くの状況で正常に機能しません。
使用例
この規則に適合する型を次の例に示します。
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 に設定します