【问题标题】:Why doesn't XmlSerializer work for shared class variables?为什么 XmlSerializer 不适用于共享类变量?
【发布时间】:2011-12-08 23:32:55
【问题描述】:

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

【问题讨论】:

    标签: vb.net xml-serialization


    【解决方案1】:

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

    【讨论】:

    • 为什么序列化只是关于序列化实例?那没有意义。为什么不能序列化静态类的属性?
    • @steve 你想问微软。他们可能会回答说,反序列化实例并让它们覆盖静态成员是没有意义的。
    • 静态成员中不一定有静态值。在设置/配置位置,在应用程序首次启动之前,您可能根本没有任何值。对我来说仍然人为地狭窄。
    • @SteveCinq 但该值在所有实例之间共享。
    • 是的,但我只有 一个实例(在我的情况下,它是一个设置文件)。而且,无论如何,如果我想要所有实例的值,我的选择。如果该类是静态的,我可能仍想对文件进行序列化。我认为限制仍然是任意的。
    【解决方案2】:

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

    例如:

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

    【讨论】:

      【解决方案3】:

      我经常发现自己想要实现自己的 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。

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多