CA2229:实现序列化构造函数
属性 | 值 |
---|---|
规则 ID | CA2229 |
标题 | 实现序列化构造函数 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
注意
此规则在 .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 类型