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



假设我有以下类结构(根据实际问题简化):

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")>改变根节点。麻烦的是为子类这样做。我不能在PL_Person类上使用<XmlRoot>标签,因为不能有两个根元素,当我试图像在属性上那样在类上使用<XmlElement>标签时,智能感知会抛出合适。当这些子类被序列化为子节点时,是否有可能控制它们的命名?

PL_PersonContactObject不是你所说的子类,它们只是属性类型。
这使你的问题令人困惑,因为它建议你可能有继承的问题(子类是从一些基类继承的类),而实际上你只是希望你的属性元素命名不同

你应该用<XmlElement>修饰你的属性(而不是类)来指定自定义名称:

<XmlElement("Persons", GetType(PL_Person))>
Public Property PeopleList As List(Of PL_Person)
作为事后的考虑,我绝对不建议使用这种尴尬的约定来调用您的类。在。net中,不应该在类名中使用任何前缀或下划线。就叫它Person

最新更新