【发布时间】:2019-12-25 00:00:51
【问题描述】:
有人理解 Sonarqube 中的这个错误吗?我们想要实现一个网格需求维度——给定一些图片。 2 张图片是 1X2 网格,4 张图片是 2X2,6 张图片是 3X2,等等。Sonarqube 要求为这些简单的静态类实现 Serializable。我将如何解决这个问题,是否有必要?
当前代码:
public class CardDimensionRequirement:Dictionary<int, CardDimensionRequirementLine>
{
public void AddItem(int PictureCount, int Length, int Height, int BootstrapDimension)
{
base.Add(PictureCount, new CardDimensionRequirementLine(PictureCount, Length, Height, BootstrapDimension));
}
public int GetMaxKey()
{
return base.Keys.Max();
}
}
static class CardDimensionRequirementSpecs
{
public static CardDimensionRequirement cardDimensionRequirementData;
static CardDimensionRequirementSpecs()
{
//int PictureCount, int Length, int Height, int BootstrapDimension
cardDimensionRequirementData = new CardDimensionRequirement();
cardDimensionRequirementData.AddItem(1, 1, 1, 1);
cardDimensionRequirementData.AddItem(2, 2, 1, 6);
cardDimensionRequirementData.AddItem(3, 3, 1, 4);
cardDimensionRequirementData.AddItem(4, 2, 2, 6);
cardDimensionRequirementData.AddItem(5, 3, 2, 4);
cardDimensionRequirementData.AddItem(6, 3, 2, 4);
}
}
SonarQube 推荐:
The ISerializable interface is the mechanism to control the type serialization process. If not implemented correctly this could result in an invalid serialization and hard to detect bugs.
This rules raises an issue on types that implement ISerializable without following the serialization pattern recommended by Microsoft.
Specifically this rule checks for these problems:
The System.SerializableAttribute attribute is missing.
Non-serializable fields are not marked with the System.NonSerializedAttribute attribute.
There is no serialization constructor.
An unsealed type has a serialization constructor that is not protected.
A sealed type has a serialization constructor that is not private.
An unsealed type has a ISerializable.GetObjectData that is not both public and virtual.
A derived type has a serialization constructor that does not call the base constructor.
A derived type has a ISerializable.GetObjectData method that does not call the base method.
A derived type has serializable fields but the ISerializable.GetObjectData method is not overridden.
Noncompliant Code Example
public class Foo : ISerializable // Noncompliant the [Serializable] attribute is missing
{
}
or
public class Bar
{
}
[Serializable]
public class Foo : ISerializable // Noncompliant the serialization constructor is missing
{
private readonly Bar bar; // Noncompliant the field is not marked with [NonSerialized]
}
Compliant Solution
public class Bar
{
}
[Serializable]
public class Foo : ISerializable
{
[NonSerialized]
private readonly Bar bar;
public Foo()
{
// ...
}
protected Foo(SerializationInfo info, StreamingContext context)
{
// ...
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
// ...
}
}
[Serializable]
public sealed class SubFoo : Foo
{
private int val;
public SubFoo()
{
// ...
}
private SubFoo(SerializationInfo info, StreamingContext context)
: base(info, context)
{
// ...
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
// ...
}
}
Exceptions
Classes in test projects are not checked.
【问题讨论】:
-
这可能是因为您的基类
Dictionary<TKey, TValue>实现了ISerializable并应用了[Serializable],因此可能会出现此错误。尝试实现IDictionary<int, CardDimensionRequirementLine>并将您的字典作为私有成员包含在其中,看看错误是否消失。 -
另外,您是否需要通过
BinaryFormatter和/或数据合约序列化程序来序列化您的类型? -
嗨@dbc 你怎么知道Dictionary 实现了ISerializable?问题已解决!你记得在你的头上吗?随意放置答案,我可以给分,希望能够自学,您似乎忽略了Sonarqube解决方案,并找到了真正的解决方法,有时代码分析器不正确
-
我可以写一个答案。一个问题:您最终是实现了
ISerializable还是直接实现了IDictionary<int, CardDimensionRequirementLine>? -
@dbc 第二个选项 IDictionary
标签: c# asp.net-core serialization .net-core sonarqube