| 属性 | 值 |
|---|---|
| 规则 ID | CA2229 |
| 标题 | 实现序列化构造函数 |
| 类别 | 使用情况 |
| 修复会引起中断还是不会引起中断 | 非中断 |
| 在 .NET 10 中默认启用 | 否 |
| 适用的语言 | C# 和 Visual Basic |
注意
此规则在 .NET 8 中已被移除,因为它与 SYSLIB0051:旧序列化支持 API 已过时冲突。
原因
该类型实现 System.Runtime.Serialization.ISerializable 接口,它不是委托或接口,并且满足以下条件之一:
该类型没有一个能够接受 SerializationInfo 对象和 StreamingContext 对象的构造函数(即序列化构造函数的签名)。
该类型是非密封的,其序列化构造函数的访问修饰符不受保护(系列)。
该类型是密封的,其序列化构造函数的访问修饰符不是专用的。
规则说明
此规则适用于支持自定义序列化的类型。 如果类型可实现 ISerializable 接口,则它支持自定义序列化。 需要序列化构造函数来对已使用 ISerializable.GetObjectData 方法序列化的对象进行反序列化或重新创建这些对象。
如何解决违规
要修复与该规则的冲突,请实现序列化构造函数。 对于密封类,将构造函数设为私有;否则,将构造函数设为受保护。
何时禁止显示警告
请勿抑制此规则的违规行为。 该类型将不可反序列化,并且在许多情况下将不起作用。
示例
以下示例显示了满足此规则的类型。
[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:用 SerializableAttribute 标记 ISerializable 类型