我在代码库中处理代码分析警告时遇到了这段代码。我想更改名称,但不是否会导致序列化问题。虽然在我看来它可以序列化是没有意义的,但我只是想检查以确保在删除属性之前我没有遗漏任何东西。
[Serializable]
public class FileIsNotReadonlyVerifier : IFileVerifier
{
#region IFileVerifier Members
public void Verify(FileInfo file, FlatFileTrafficSystem system)
{
if ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
throw new VerificationException(Resources.VerificationException_FileIsReadonly);
}
}
#endregion
}
答案 0 :(得分:7)
是的,请将此标记为可序列化。原因是如果您没有使用您的类型的任何人将无法序列化此类的实例。
[Serializable]
public class MyType {
// Breaks serialization.
private readonly FileIsNotReadonlyVerifier _verifier;
// Might work, might break. Depends on the implementation. Have to use
// another context variable to serialize / deserialize this.
private readonly IFileVerifier _otherVerifier;
}
在这种情况下使其工作的唯一方法是使变量不可序列化,使用另一个变量来跟踪状态,并使用fixup逻辑覆盖特殊的序列化方法。
我多次遇到这个问题而且非常令人沮丧。最值得注意的是,我在人们创建没有成员的自定义字符串比较器的地方碰到了它。为了序列化我的类型,我不得不跳过很多圈。很沮丧。
答案 1 :(得分:5)
你的课程没有密封;如果意图是有人可以将其子类化并需要序列化,那么可能会添加[Serializable]
。
<强>然而强>;我不会添加[Serializable]
“只是因为”;序列化(如线程或继承)应该计划,设计和测试。如果您当前没有序列化类型或预见需要将其序列化,那么很可能您没有为这些场景充分设计/测试它(这是100%正确;您不要不浪费时间写不必要的代码。
如果其他人使用您的类并希望可序列化,他们可以通过将其本地字段标记为[NonSerialized]
并手动处理(可能在回调中)来实现。
另请注意,在BinaryFormatter
([Serializable]
)本身的主要消费者的许多方面都存在设计问题并且相当脆弱。有基于合同的序列化器可以提供更高的稳定性。
答案 2 :(得分:4)
不完全。我曾经使用过XML标准(Open Travel Alliance),它的类型只是一个没有属性{em}的标签<Success />.
所以这只是在我的代码中实现为可序列化的类而没有属性。它用于来自Web服务的响应消息,表明服务器进程已成功。
答案 3 :(得分:0)
Iff这个类根本没有任何状态(如你的例子中),我同意,它是毫无意义的,除非你需要它用于一些模糊的远程处理场景(以及其他一些可能同样奇怪的场景)。