CA2237:必須以 SerializableAttribute 標記 ISerializable 型別
型別名稱 |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
分類 |
Microsoft.Usage |
中斷變更 |
不中斷 |
原因
外部可見的型別會實作 System.Runtime.Serialization.ISerializable 介面,而且型別並未以 System.SerializableAttribute 屬性 (Attribute) 標記。此規則會忽略基底型別 (Base Type) 未序列化的衍生型別 (Derived Type)。
規則描述
若要讓 Common Language Runtime 辨認為可序列化,即使型別透過 ISerializable 介面的實作使用自訂序列化常式,型別仍必須以 SerializableAttribute 屬性標記。
如何修正違規
若要修正此規則的違規情形,請將 SerializableAttribute 屬性套用到型別。
隱藏警告的時機
請勿針對例外狀況 (Exception) 類別 (Class) 隱藏此規則的警告,因為這些類別必須為可序列化,才能在不同的應用程式定義域上正常運作。
範例
下列範例顯示違反規則的型別。取消註解 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);
}
}
}