CA2229:实现序列化构造函数

类型名

ImplementSerializationConstructors

CheckId

CA2229

类别

Microsoft.Usage

是否重大更改

原因

该类型实现 System.Runtime.Serialization.ISerializable 接口,它不是委托或接口,并且满足下列条件之一:

规则说明

该规则与支持自定义序列化的类型相关。 如果一个类型实现 ISerializable 接口,则该类型支持自定义序列化。 反序列化或重新创建已使用 ISerializable.GetObjectData 方法序列化的对象时,需要序列化构造函数。

如何解决冲突

要修复与该规则的冲突,请实现序列化构造函数。 对于密封类,请使构造函数成为私有;否则,请使构造函数成为受保护。

何时禁止显示警告

不要禁止显示与此规则的冲突。 类型是不能反序列化的,在许多情况下无法运行。

示例

下面的示例演示一个满足该规则的类型。

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

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext