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 类型

另请参阅