假设我有以下类结构(从我的现实问题中简化):
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会引用我想要一个房产。是否甚至可以控制这些子类在被序列化为子节点时的名称?
答案 0 :(得分:2)
PL_Person
和ContactObject
不是子类,它们只是属性类型。
这会使您的问题变得混乱,因为它建议您可能have a problem with inheritance(继承自某些基类的子类are类)实际上您只需要您的属性元素用不同的名字命名。
您应该使用<XmlElement>
修饰属性(而不是类)以指定自定义名称:
<XmlElement("Persons", GetType(PL_Person))>
Public Property PeopleList As List(Of PL_Person)
作为事后的想法,我肯定不推荐使用这样一个尴尬的约定来调用你的类。在.NET中,不应在类名中使用任何前缀或下划线。只需将其称为Person
。