使静态成员持久化

时间:2014-02-03 11:07:37

标签: vb.net serialization persistence static-members

我有一个类具有私有静态(共享,因为我在VB.BET中)字段及其关联的公共静态属性,因为它存储了一个应该对该类的所有实例都相同的变量。

My Class看起来像这样:

Public MustInherit Class NitrogenController
    Private _active As Boolean
    Private Shared _controlInterval As TimeSpan
    Private _lastControlTime As Date

    Public Property Active() As Boolean
    Public Shared Property ControlInterval() As System.TimeSpan

    'other properies that must be persisted

    Public Function Control() As Boolean
        If Not Now > _lastControlTime.Add(_controlInterval) Or Not _active Then
            Return False
        Else
            DoControl()
            _lastControlTime = Now
            Return True
        End If
    End Function
End Class

当尝试二进制序列化这些类型的对象时问题到了,因为这个共享字段是正确存储的,并且在反序列化时返回其默认值。

我认为这是预期的行为,所以我的问题是......如何让共享字段持久化?我已经读过类似问题的一些评论,说这是一个糟糕的设计,但在我的情况下它确实有意义(AFAIK),因为这个变量对所有对象应该是相同的,但是可以由用户改变,因此应该存储。

你能建议另一种方式吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在我看来,你所读到的内容是正确的。这可能是一个糟糕的设计。但是,如果必须,有两种方法可以使用XmlSerializer执行此操作。简单的方法是简单地添加一个公共实例(非共享)属性,该属性具有一个getter和setter,它只是包装共享属性,例如:

Public MustInherit Class NitrogenController
    Public Shared Property ControlInterval As TimeSpan

    Public Property CurrentControlInterval() As TimeSpan
        Get
            Return ControlInterval 
        End Get
        Set(value As TimeSpan)
            ControlInterval = value
        End Set        
    End Property
End Class

如果您对该方法不满意,则第二个更复杂的选项是通过实现ISerializable接口来覆盖默认的序列化逻辑。