CA2229:必須實作序列化建構函式
屬性 | 值 |
---|---|
規則識別碼 | CA2229 |
職稱 | 必須實作序列化建構函式 |
類別 | 使用方式 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 9 中啟用 | No |
注意
此規則在 .NET 8 中已移除,因為它與SYSLIB0051衝突 :舊版串行化支援 API 已過時。
原因
類型會實作 System.Runtime.Serialization.ISerializable 介面,不是委派或介面,下列其中一個條件為 true:
此類型沒有接受 SerializationInfo 物件和 StreamingContext 物件的建構函式(串行化建構函式的簽章)。
類型未密封,且其串行化建構函式的存取修飾詞不受保護(系列)。
類型是密封的,而且其串行化建構函式的存取修飾詞不是私用的。
檔案描述
此規則與支援自訂序列化的類型相關。 如果類型實作 ISerializable 介面,則其支援自訂序列化。 串行化建構函式是還原串行化或使用 方法串行化 ISerializable.GetObjectData 或重新建立的物件所需的建構函式。
如何修正違規
若要修正此規則的違規情形,請實作序列化建構函式。 針對密封類別,讓建構函式成為 private,否則為 protected。
隱藏警告的時機
請勿隱藏違反規則的行為。 此類型將無法還原串行化,而且在許多案例中將無法運作。
範例
下列範例顯示符合規則的類型。
[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 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
(int)info.GetValue(nameof(n1), typeof(int))! :
-1;
}
// The following method serializes the instance.
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue(nameof(n1), n1);
}
}
相關規則
CA2237:ISerializable 類型必須標記 SerializableAttribute