如何控制序列化子类的元素名称?

时间:2011-07-05 21:45:55

标签: vb.net xml-serialization

假设我有以下类结构(从我的现实问题中简化):

Public Class PC_People_Container
    Private _people_list As New List(Of PL_Person)

    Public Sub New()
    End Sub

    Public Sub Add(ByVal item As PL_Person)
        _people_list.Add(item)
    End Sub

    Public Property PeopleList As List(Of PL_Person)
        Get
            Return _people_list
        End Get
        Set(ByVal value As List(Of PL_Person))
            _people_list = value
        End Set
    End Property

End Class

Public Class PL_Person
    Private _Name As String
    Public Property Name As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Private _Contacts As ContactObject
    Public Property Contacts As ContactObject
        Get
            Return _Contacts
        End Get
        Set(ByVal value As ContactObject)
            _Contacts = value
        End Set
    End Property

    Public Sub New()
    End Sub

End Class

Public Class ContactObject
    Public Property PhoneNumber As String
    Public Property EmailAddress As String

    Public Sub New()
    End Sub
End Class

如果我要对此进行序列化,我将在XML中获取默认的指定节点名称。这意味着我的根名为PC_People_Container,列表中的每个人都标记为PL_Person。我知道我可以使用<XmlRoot(ElementName:="PeopleContainer")>更改根节点。麻烦就是为子类做这件事。我无法在<XmlRoot>类上使用PL_Person标记,因为不能有两个根元素,当我尝试在类上使用<XmlElement>标记时,IntelliSense会引用我想要一个房产。是否甚至可以控制这些子类在被序列化为子节点时的名称?

1 个答案:

答案 0 :(得分:2)

您调用它们时,

PL_PersonContactObject不是子类,它们只是属性类型。
这会使您的问题变得混乱,因为它建议您可能have a problem with inheritance(继承自某些基类的子类are类)实际上您只需要您的属性元素用不同的名字命名

您应该使用<XmlElement>修饰属性(而不是类)以指定自定义名称:

<XmlElement("Persons", GetType(PL_Person))>
Public Property PeopleList As List(Of PL_Person)

作为事后的想法,我肯定不推荐使用这样一个尴尬的约定来调用你的类。在.NET中,不应在类名中使用任何前缀或下划线。只需将其称为Person