我在代码库中处理代码分析警告时遇到了这段代码.我想更改名称,但不是否会导致序列化问题.虽然它看起来像它是可序列化的没有意义,但我只想检查以确保在删除属性之前我没有遗漏某些东西.
[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)
是的,请将此标记为可序列化.原因是,如果您没有使用您的类型的任何人将无法序列化此类的实例.
[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逻辑覆盖特殊的序列化方法.
我已多次遇到这个问题而且非常令人沮丧.最值得注意的是,我在人们创建没有成员的自定义字符串比较器的地方碰到了它.为了序列化我的类型,我不得不跳过很多圈.很沮丧.
你的班级没有密封; 如果意图是有人可以将它子类化并需要序列化它,那么也许可以添加[Serializable].
然而 ; 我不会加[Serializable]"只是因为"; 序列化(如线程或继承)是应该进行规划,设计和测试的.如果您当前没有序列化类型或预见需要序列化它,那么很可能您没有为这些场景充分设计/测试它(这是100%正确;您不会浪费时间编写不必要的代码).
如果其他人使用您的类并希望可序列化,他们可以通过将其本地字段标记为[NonSerialized]并手动处理(可能在回调中)来实现.
还要注意,在许多方面BinaryFormatter(这是主要的消费者[Serializable])本身存在设计问题并且相当脆弱.有基于合同的序列化器可以提供更高的稳定性.
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |