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

ram*_*nik 2 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
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 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;

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下使其工作的唯一方法是使变量不可序列化,使用另一个变量来跟踪状态,并使用fixup逻辑覆盖特殊的序列化方法.

我已多次遇到这个问题而且非常令人沮丧.最值得注意的是,我在人们创建没有成员的自定义字符串比较器的地方碰到了它.为了序列化我的类型,我不得不跳过很多圈.很沮丧.

  • 在这种情况下,您只需在_verifier上添加[NonSerialized]并在回调中执行此操作. (3认同)

Mar*_*ell 5

你的班级没有密封; 如果意图是有人可以将它子类化并需要序列化它,那么也许可以添加[Serializable].

然而 ; 我不会[Serializable]"只是因为"; 序列化(如线程或继承)是应该进行规划,设计和测试的.如果您当前没有序列化类型或预见需要序列化它,那么很可能您没有为这些场景充分设计/测试它(这是100%正确;您不会浪费时间编写不必要的代码).

如果其他人使用您的类并希望可序列化,他们可以通过将其本地字段标记为[NonSerialized]并手动处理(可能在回调中)来实现.

还要注意,在许多方面BinaryFormatter(这是主要的消费者[Serializable])本身存在设计问题并且相当脆弱.有基于合同的序列化器可以提供更高的稳定性.