为什么 XmlSerializer 不适用于共享类变量?



我有下面的类,我想序列化为XML:

<Serializable()> _
Public Class Settings
    Public Shared var1 As Boolean = False 
    Public var2 As Boolean = False 
End Class

我创建了一个新的实例,并使用我自己的方法序列化它…

SaveSerialXML(PathToFile, New Settings, GetType(Settings))

…但是,共享(静态)变量不包括在输出中:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <var2>false</var2>
</Settings>

有谁知道一种方法来序列化一个类的共享成员XML?

序列化是关于序列化实例的。Shared变量不属于实例

你可以通过添加一个redirect实例属性来实现序列化。

例如:

Public Property Var1Instance As Boolean
    Get
        Return Var1
    End Get
    Set(value As Boolean)
        Var1 = value
    End Set
End Property

我经常发现自己想实现自己的Xml序列化,而不使用。net XmlSerializer。

我通过在我的类中添加一个Xml属性来实现这一点,该属性直接通过Xml Literals处理序列化。这个属性可以是String或者XElement取决于我如何使用它

下面是示例类的Xml String属性:

Public Property Xml() As String
    Get
        Return <Settings>
                   <var1><%= var1 %></var1>
                   <var2><%= var2 %></var2>
               </Settings>.ToString
    End Get
    Set(ByVal value As String)
        Dim xValue = XElement.Parse(value)
        var1 = xValue...<var1>.Value = "true"
        var2 = xValue...<var2>.Value = "true"
    End Set
End Property

这将所有序列化逻辑放在一个地方,并避免使用属性来控制实例的序列化方式。我发现的另一个好处是,这允许我反序列化没有默认构造函数的类。

在生产场景中,我将添加一个扩展方法,将String转换为Boolean,而不是与"true"进行比较,因为有效的Xml布尔值包括true, false, 1和0。

最新更新