CA2229:請實作序列化建構函式
型別名稱 |
ImplementSerializationConstructors |
CheckId |
CA2229 |
分類 |
Microsoft.Usage |
中斷變更 |
不中斷 |
原因
型別實作 System.Runtime.Serialization.ISerializable 介面、不是委派 (Delegate) 或介面,並符合下列其中一個條件:
型別沒有採用 System.Runtime.Serialization.SerializationInfo 物件和 System.Runtime.Serialization.StreamingContext 物件 (序列化 (Serialization) 建構函式的簽章) 的建構函式。
型別為非密封且它的序列化建構函式的存取修飾詞 (Modifier) 不是 protected (Family)。
型別為密封且它的序列化建構函式的存取修飾詞不是 private。
規則描述
此規則會與支援自訂序列化的型別相關。 如果型別會實作 ISerializable 介面,就表示會支援自訂序列化。 對於使用 ISerializable.GetObjectData 方法序列化的物件,若要還原序列化或重新建立,則需要使用序列化建構函式。
如何修正違規
若要修正此規則的違規情形,請實作序列化建構函式。 針對密封類別,讓建構函式成為 private,否則為 protected。
隱藏警告的時機
請勿隱藏此規則的違規。 將該型別無法被還原序列化,而且在許多案例中也無法運作。
範例
下列範例會顯示滿足規則的型別。
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:必須以 SerializableAttribute 標記 ISerializable 型別
請參閱
參考
System.Runtime.Serialization.ISerializable