【问题标题】:Pseudo readonly property on with serialization带有序列化的伪只读属性
【发布时间】:2011-03-20 23:18:54
【问题描述】:

这样的事情有多糟糕:

public class Test
{
    private string pKey = null;
    public string Key { 
        get { return pKey; } 
        set { if (pKey==null) pKey=value;} 
    }
}

这将允许我在类中使用XMLSerializer,并确保Key 在初始设置后无法更改。

【问题讨论】:

  • pKey 应该是私有的吗?
  • 操作,是的,pKey 应该是私有的。我真正想要的是public string Key { get; private set; } 之类的东西,但 XmlSerializer 不允许这样做。

标签: c# properties readonly xmlserializer


【解决方案1】:

我同意我最初的想法很糟糕。

我现在知道没有办法使用标准的 XML 序列化器来实现这一点。 'ssg' 建议不会被序列化,因为它没有公共设置器。

这里唯一的选择是实现IXmlSerializable,或使用其他序列化方法,如DataContractSerializer。前者的问题是该类的每个派生类也必须实现IXmlSerializable;后者的问题是您不能使用属性或对生成的 XML 有太多控制。

【讨论】:

    【解决方案2】:

    不好,考虑一下:

    test.pKey = null;
    test.Key = 'my new key';
    

    我已经设法绕过了你的保护(显然你可以在 set 方法中添加一个null 检查来解决这个问题)。

    如果反序列化对象有一个null 键,则可能会出现同样的问题,该键仍然可以在第一次访问时设置...看起来如果你需要这种保护,你应该看看另一种获取方式。

    XMLSerializer 对您使用的类设置了限制,如果试图绕过这些限制,您可能会造成混淆。如果您是一家单人商店并且您是唯一查看代码的人,那么这可能不是问题(至少在您离开代码几个月之前),但是在多开发人员中环境 你班级的行为很可能引起混乱。例如,您通过不引发异常来隐藏分配不起作用,因此分配操作将编译并运行,但不会更新对象并且不会引发异常以指示失败(这可能导致一些难以追踪错误)。

    【讨论】:

    • 这应该会发生,如果尝试将 Key 设置为空值,我可能会抛出异常(在我的代码中,这将被视为错误,所以我可以接受)。
    • 您可以将空异常替换为每个属性的 _isSetted 布尔字段。如果这对您来说是个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多