【发布时间】:2020-02-20 02:13:37
【问题描述】:
SonarCube 向我显示以下异常实现的错误“更新 'ISerializable' 的此实现以符合推荐的序列化模式”:
[Serializable]
public class UnrecoverableException : Exception, ISerializable
{
public bool Ignore { get; }
public UnrecoverableException()
{
}
public UnrecoverableException(string message, Exception innerException)
: base(message, innerException)
{
}
protected UnrecoverableException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
Ignore= info.GetBoolean(nameof(Ignore));
}
public UnrecoverableException(string message, bool ignore= false) : base(message)
{
Ignore= ignore;
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(Ignore), Ignore);
base.GetObjectData(info, context);
}
}
不知道我这里出了什么问题,似乎完全遵循这里描述的规则https://rules.sonarsource.com/csharp/tag/pitfall/RSPEC-3925
此规则会在未遵循 Microsoft 推荐的序列化模式的情况下实现
ISerializable的类型产生问题。
System.SerializableAttribute属性缺失。不可序列化的字段未使用
System.NonSerializedAttribute属性进行标记。没有序列化构造函数。
未密封的类型具有不受保护的序列化构造函数。
密封类型具有非私有的序列化构造函数。
未密封类型的
ISerializable.GetObjectData既不是公共的也不是虚拟的。派生类型具有不调用基构造函数的序列化构造函数。
派生类型具有不调用基方法的
ISerializable.GetObjectData方法。派生类型具有可序列化的字段,但
ISerializable.GetObjectData方法未被覆盖。
【问题讨论】:
-
我认为问题可能出在这种“未密封的类型具有不受保护的序列化构造函数”的情况。但是,如果我需要直接抛出这种类型的异常并从它派生出其他异常呢
-
我认为它不喜欢自动属性的支持字段。我敢打赌它没有用序列化属性装饰。如果您删除该属性,或将其更改为具有根据规则装饰的显式支持字段的属性,会发生什么情况?
-
问题确实与受保护成员与公共成员有关
-
酷,你明白了吗?我对答案很感兴趣。
-
你可以在下面回答你自己的问题,你知道吗?
标签: c# sonarqube iserializable