CA2236:必須呼叫 ISerializable 型別上的基底類別方法
型別名稱 |
CallBaseClassMethodsOnISerializableTypes |
CheckId |
CA2236 |
分類 |
Microsoft.Usage |
中斷變更 |
不中斷 |
原因
型別衍生自實作 System.Runtime.Serialization.ISerializable 介面的型別,而且符合下列其中一個條件:
此型別會實作序列化 (Serialization) 建構函式 (Constructor),亦即,具有 System.Runtime.Serialization.SerializationInfo、System.Runtime.Serialization.StreamingContext 參數簽章的建構函式,但是不會呼叫基底型別 (Base Type) 的序列化建構函式。
此型別會實作 ISerializable.GetObjectData 方法,但不會呼叫基底型別的 GetObjectData 方法。
規則描述
在自訂序列化處理序 (Process) 中,型別會實作 GetObjectData 方法,序列化它的欄位及序列化建構函式,以便將欄位還原序列化。 如果型別是衍生自實作 ISerializable 介面的型別,則應會呼叫基底型別 GetObjectData 方法和序列化建構函式,以便將基底型別的欄位序列化/還原序列化。 否則,無法將該型別正確地序列化和還原序列化。 請注意,如果衍生型別 (Derived Type) 沒有加入任何新的欄位,則型別不需實作 GetObjectData 方法,也不需實作序列化建構函式,或呼叫基底型別對等用法。
如何修正違規
若要修正此規則的違規情形,請從對應的衍生型別方法或建構函式,呼叫基底型別 GetObjectData 方法或序列化建構函式。
隱藏警告的時機
請勿隱藏此規則的警告。
範例
下列範例會呼叫基底類別的序列化建構函式和 GetObjectData 方法,以顯示滿足規則的衍生型別。
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
<SerializableAttribute> _
Public Class DerivedType: Inherits BaseType
Dim derivedValue As Integer
Sub New()
derivedValue = 4
End Sub
Protected Sub New( _
info As SerializationInfo, context As StreamingContext)
MyBase.New(info, context)
derivedValue = info.GetInt32("derivedValue")
End Sub
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overrides Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext)
info.AddValue("derivedValue", derivedValue)
MyBase.GetObjectData(info, context)
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);
}
}
[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);
}
}
}