【问题标题】:Raise a Visual Studio warning when using an empty property setter使用空属性设置器时引发 Visual Studio 警告
【发布时间】:2011-09-02 11:01:32
【问题描述】:

我需要创建一个可序列化的类。 在这个类中,我有一个 MyGuid 只读属性,我想要可序列化但不能反序列化(属性在支持字段中初始化)。 您知道,使用基本序列化 .NET 功能,具有 reandonly 属性会使反序列化失败,因为它无法反序列化 readonly 属性。 所以我决定创建一个带有支持字段的公共 get-set MyGuid 属性,并且让 setter 什么都不做:

[Serializable]
public class Task : ITask
{
    private readonly Guid m_guid = Guid.NewGuid();
    public MyGuid Guid
    {
        get { return m_guid; }
        set { /*Empty setter!*/ }
    }
}

现在我不想在我的脚上开枪...... 有一种方法可以将 MyGuid 属性的设置器设置为“可弃用”或“禁用”? 如果我尝试使用 setter,最好让 Visual Studio 警告我。

或者,有更好的方法来管理这种需求?

谢谢!

编辑:在这里找到了一些东西:Serializing private member data我正在阅读...

【问题讨论】:

  • 如果你不打算反序列化它,为什么要序列化它?您可以在属性上使用[NonSerialized] 或System.Xml.Serialization.XmlIgnore] 属性吗?

标签: c# .net serialization serializable


【解决方案1】:
public Guid Guid
{
    get { return m_guid; }
    set { if (value != null) Debugger.Log(0, "Warning", "This property has an empty setter, just for serializing purpose!"); }
}

如果您不小心自己设置了值,您将在调试窗口中收到警告。另一方面,您绝对需要序列化器的设置器,否则反序列化器将永远无法在从文件中读取该属性后为其指定一个值!所以 setter 不适合你,而是让序列化器正常运行。

【讨论】:

  • 嗯,不错的解决方案!确切的代码是这样的: if (value != null) { Debugger.Log(0, "Warning", "This property has a empty setter, just for serializing purpose!"); }
  • 在 VS2010 中我必须在哪里查找 Debugger 消息?
  • 按照菜单:View > Output > Show output from > Debugger。一旦您开始调试应用程序(按 F5),它也会自动显示在本地窗口旁边。
  • 好的,谢谢。但它不是太明显,那里......我会继续寻找更强大的解决方案,我真的很在乎我的脚! :-)
  • 不客气。如果您真的需要强信号,请使用Debugger.Break(); :)
【解决方案2】:

如果你不包含设置,它会自动知道它的只读,所以不会让你设置它。然后,当您尝试时,它会在您的代码中标记错误

【讨论】:

  • 他的意思是您必须包含该集合才能使序列化工作。他只是希望它被标记为他(或其他任何人)试图使用代码中设置的属性。
  • 如果我不包含该集合,我的类将无法序列化... :-)
猜你喜欢
  • 2020-04-20
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2011-05-19
相关资源
最近更新 更多