Десериализация строки, разделенной пробелом, в общий список - PullRequest
0 голосов
/ 19 октября 2011

У меня есть XML-файл с элементами, которые выглядят так (сокращенно для ясности):

<post id="1" tags="tag1 tag2 tag3 tag4" />

Я хочу сопоставить это следующему классу с помощью десериализации Xml, но не могу найти способ сопоставить атрибут тегов с фактическим списком (строкой).

<Serializable()> _
<XmlRootAttribute("post")> _
Public Class Post
Private m_id As Integer
Private m_tags As String

<XmlAttribute("id")> _
Public Property Id() As Integer
    Get
        Return m_id
    End Get
    Set(ByVal value As Integer)
        m_id = value
    End Set
End Property

'<XmlAttribute("tags")> _
Public Property Tags() As List(Of String)
    Get
        Return m_tags
    End Get
    Set(ByVal value As List(Of String))
        m_tags = value
    End Set
End Property
End Class

Есть ли способ переопределить десериализацию по умолчанию?

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Я думаю, что проще всего иметь свойство RawTags get / set, которое сериализуется, и свойство Tags readonly, которое анализирует RawTags в List<string>, но игнорируется сериализатором:

<Serializable()> 
    <XmlRootAttribute("post")> 
    Public Class Post
    Private m_id As Integer
    Private m_tags As String

    <XmlAttribute("id")> 
    Public Property Id() As Integer
        Get
            Return m_id
        End Get
        Set(ByVal value As Integer)
            m_id = value
        End Set
    End Property

   <XmlAttribute("tags")> 
    Public Property RawTags() As String
        Get
            Return m_tags 
        End Get
        Set(ByVal value As String)
            m_tags = value
        End Set
    End Property

    <XmlIgnore>
    Public ReadOnly Property Tags() As List(Of String)
        Get
            Return m_tags.Split(" ").ToList()
        End Get
    End Property
    End Class
0 голосов
/ 19 октября 2011

Я могу ошибаться, но десериализатор увидит это в виде строки, такой же, как "tag1tag2tag3tag4". Я не знаю, что вы можете десериализовать в список через разделители.

Вы можете сериализовать атрибут в переменную, а затем создать свойство Tags () через строку, разбитую на массив, а затем array.ToList (). Я не уверен, что есть ли хитрый способ десериализации, но это, безусловно, сработает.

...