CA2236: ISerializable 型で基本クラス メソッドを呼び出します
Item | [値] |
---|---|
規則 ID | CA2236 |
カテゴリ | Microsoft.Usage |
互換性に影響する変更点 | なし |
原因
型が、System.Runtime.Serialization.ISerializable インターフェイスを実装している型から派生していて、以下の条件のいずれかに該当しています。
この型はシリアル化コンストラクター、つまり、System.Runtime.Serialization.StreamingContext パラメーター シグネチャである System.Runtime.Serialization.SerializationInfo を持つコンストラクターを実装していますが、基本データ型のシリアル化コンストラクターを呼び出していません。
その型では System.Runtime.Serialization.ISerializable.GetObjectData メソッドを実装していますが、基本データ型の GetObjectData メソッドを呼び出していません。
規則の説明
カスタムのシリアル化プロセスでは、型に、フィールドをシリアル化する GetObjectData メソッドと、フィールドを逆シリアル化するシリアル化コンストラクターを実装します。 型が ISerializable インターフェイスを実装する型から派生している場合は、基本データ型 GetObjectData のメソッドとシリアル化コンストラクターを呼び出して、その基本データ型のフィールドをシリアル化および逆シリアル化する必要があります。 それ以外の場合、その型のシリアル化と逆シリアル化が正しく行われません。 派生型で新しいフィールドが追加されない場合、その型では、GetObjectData メソッドやシリアル化コンストラクターを実装したり、同等の基本データ型を呼び出したりする必要がないことに注意してください。
違反の修正方法
この規則違反を修正するには、基本データ型の GetObjectData メソッドまたはシリアル化コンストラクターを、対応する派生型のメソッドまたはコンストラクターから呼び出します。
どのようなときに警告を抑制するか
この規則による警告は抑制しないでください。
例
次の例は、シリアル化コンストラクターと基底クラスの GetObjectData メソッドを呼び出すことによってこの規則に従っている派生型を示しています。
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
[SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
[SerializableAttribute]
public class DerivedType : BaseType
{
int derivedValue;
public DerivedType()
{
derivedValue = 4;
}
protected DerivedType(
SerializationInfo info, StreamingContext context) :
base(info, context)
{
derivedValue = info.GetInt32("derivedValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public override void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("derivedValue", derivedValue);
base.GetObjectData(info, context);
}
}
}
関連規則
CA2240: ISerializable を正しく実装します
CA2235:すべてのシリアル化不可能なフィールドを設定します
CA2237:ISerializable 型を SerializableAttribute に設定します
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示