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

时间:2011-12-08 23:32:56

标签: vb.net xml-serialization

我有以下要将其序列化为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的方法吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以作弊添加重定向实例属性以进行序列化。

例如:

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

答案 2 :(得分:0)

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

我这样做是通过向我的类添加一个Xml属性,通过 Xml Literals 直接处理序列化。该属性可以是StringXElement,具体取决于我将如何使用它。

以下是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。