CA2229:实现序列化构造函数
类型名 |
ImplementSerializationConstructors |
CheckId |
CA2229 |
类别 |
Microsoft.Usage |
是否重大更改 |
否 |
原因
该类型实现 System.Runtime.Serialization.ISerializable 接口,它不是委托或接口,并且满足下列条件之一:
类型没有采用 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)的构造函数。
类型未密封,其序列化构造函数的访问修饰符未受保护。
类型是密封的,其序列化构造函数的访问修饰符不是私有的。
规则说明
该规则与支持自定义序列化的类型相关。 如果一个类型实现 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