假设我有以下类结构(根据实际问题简化):
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_Person
和ContactObject
不是你所说的子类,它们只是属性类型。
这使你的问题令人困惑,因为它建议你可能有继承的问题(子类是从一些基类继承的类),而实际上你只是希望你的属性元素命名不同。
你应该用<XmlElement>
修饰你的属性(而不是类)来指定自定义名称:
<XmlElement("Persons", GetType(PL_Person))>
Public Property PeopleList As List(Of PL_Person)
作为事后的考虑,我绝对不建议使用这种尴尬的约定来调用您的类。在。net中,不应该在类名中使用任何前缀或下划线。就叫它Person
吧