Почему XmlSerializer не работает для переменных общего класса? - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть следующий класс, который я хочу сериализовать в 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 ]

2 голосов
/ 09 декабря 2011

Сериализация о сериализации экземпляров.Shared переменные не принадлежат экземпляру.

1 голос
/ 09 декабря 2011

Вы можете обмануть, добавив свойство экземпляра перенаправления для сериализации.

Например:

Public Property Var1Instance As Boolean
    Get
        Return Var1
    End Get
    Set(value As Boolean)
        Var1 = value
    End Set
End Property
0 голосов
/ 09 декабря 2011

Мне часто хотелось реализовать свою собственную сериализацию Xml и не использовать .NET XmlSerializer.

Я делаю это, добавляя свойство Xml в мой класс, который напрямую обрабатывает сериализацию с помощью XML-литералы .Это свойство может быть 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.

...