将没有属性的类标记为Serializable是没有意义的吗?

时间:2009-07-16 20:03:13

标签: c# serialization

我在代码库中处理代码分析警告时遇到了这段代码。我想更改名称,但不是否会导致序列化问题。虽然在我看来它可以序列化是没有意义的,但我只是想检查以确保在删除属性之前我没有遗漏任何东西。

[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
}

4 个答案:

答案 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这个类根本没有任何状态(如你的例子中),我同意,它是毫无意义的,除非你需要它用于一些模糊的远程处理场景(以及其他一些可能同样奇怪的场景)。