2011-10-19 28 views
0

我有一个看起来像这样的元素的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

我认为最简单的办法是有一个RawTags的get/set属性,该属性被序列化,并解析RawTags到List<string>但得到由串行忽视的Tags只读属性:

<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

我可能是错的,但反序列化器只会将它看作一个字符串,与“tag1tag2tag3tag4”一样。我不知道你可以通过分隔符反序列化成一个列表。

您可以将该属性序列化为变量,然后通过将字符串拆分成数组然后创建数组,然后通过array.ToList()创建Tags()属性。我不确定是否有一种光滑的反序列化方式去实现它,但那肯定会起作用。