2011-07-05 39 views
2

比方说,我有下面的类结构(从我的实际问题简化):如何控制序列化子类的元素名称?

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>标记时,智能感知会引发适应,就像我在属性中那样。当它们被序列化为子节点时,甚至可以控制这些子类的命名?

回答

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

+0

有道理。感谢您的澄清。 – mounty

相关问题