问题 Resharper不会自动转换为Serializable类中的自动属性 ​​- 我应该吗?


我今天遇到了这个问题,并且能够确定在进行代码清理时,R#不会将属性从支持字段转换为使用SerializableAttribute修饰的类中的自动属性,例如

using System; 

namespace DataContracts
{
    [Serializable]
    public class Class1
    {
        private bool _wontChange;

        public bool WontChange
        {
            get { return _wontChange; }
            set { _wontChange = value; }
        }
    }
}

在自动代码清理期间,不会更改上述代码。当然,我可以手动执行此操作,我仍然可以从R#获取快速操作菜单选项,以便在单个属性级别执行此操作。但它让我想知道在使用自动属性时是否存在我不知道的潜在问题 [Serializable] 类。

在里面 JetBrains论坛帖子 我们被提到了 一个问题 其中讨论了这个问题,但似乎没有明确解决。


7764
2017-08-12 16:45


起源

你说你可以使用“快速操作菜单”来完成这项工作。选项就不存在了。当我删除serializable属性时,一切正常。 - Samuel


答案:


当序列化对象时,字段名称等开始变得重要,因为大多数序列化机制使用字段名称来恢复序列化数据。现在,当您更改字段名称时,无法正确读取较旧的序列化版本。

转换为自动属性时,后备字段将具有自动生成的名称,该名称与旧名称不匹配。因此,这会在读取旧的序列化数据时引入潜在的问题。

我假设要避免这个陷阱,如果类被标记为可序列化,R#不会自动将其更改为自动属性。


12
2017-08-12 19:15



我认为这对于从同一DLL序列化和反序列化的对象不会是一个问题 - 后备字段将在DLL中静态定义。这是一个有效的假设吗? - arootbeer
我从未遇到过使用自动属性和序列化描述的这个问题。我已经阅读了R#bug youtrack.jetbrains.com/issue/RSRP-63531 在它和这个SO没有提供证据表明这在行动?可重复的项目在哪里?这是CLR1和CLR2中的一个问题,它是在后来的CLR 2更新中还是在CLR 4中修复的? - Rodney S. Foley
非常感谢。在他们的网站上记录这种类型的功能会很好。 - Samuel