CA2237: ISerializable 型を SerializableAttribute に設定します
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
分類 |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
外部から参照できる型で、ISerializable インターフェイスを実装していますが、その型は SerializableAttribute 属性でマークされていません。この規則では、基本型がシリアル化できない派生型は無視されます。
規則の説明
共通言語ランタイムでシリアル化できると認識されるには、型を SerializableAttribute 属性でマークする必要があります。ISerializable インターフェイスを実装して、型でカスタムのシリアル化ルーチンを使用している場合でも、マークする必要があります。
違反の修正方法
この規則違反を修正するには、型に SerializableAttribute 属性を適用します。
警告を抑制する状況
例外クラスの場合、複数のアプリケーション ドメインで正しく機能するように、シリアル化できる必要があるため、この規則による警告を抑制しないでください。
使用例
この規則に違反する型を次の例に示します。この規則に適合するには、SerializableAttribute 属性行をコメントから外します。
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
' <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
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
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);
}
}
}
関連規則
CA2236: ISerializable 型で基本クラス メソッドを呼び出します
CA2240: ISerializable を正しく実装します
CA2235: すべてのシリアル化不可能なフィールドを設定します