2015-01-17 2 views
1

Я пытаюсь сериализовать класс в VB с помощью XMLSerializer. Но когда я вызываю GetType для моего класса, я получил ошибку InvalidOperationException.InvalidOperationException on GetType

Dim Playlist_serialize As New XmlSerializer(p.GetType)

Вот мой класс:

Public Class Playlist 
Private p_name As String 
Private p_elements As List(Of Playlist_element) 

Sub New() 
    p_elements = New List(Of Playlist_element) 
End Sub 

Public Property Name() As String 
    Get 
     Name = p_name 
    End Get 
    Set(value As String) 
     p_name = value 
    End Set 
End Property 

Public Property Elements() As List(Of Playlist_element) 
    Get 
     Elements = p_elements 
    End Get 
    Set(value As List(Of Playlist_element)) 
     p_elements = value 
    End Set 
End Property 

Вот мой Playlist_element:

Public Class Playlist_element 
Private p_Name As String 
Private p_Type As String 
Private p_Genre As String 

Public Property Name() As String 
    Get 
     Name = p_Name 
    End Get 
    Set(value As String) 
     p_Name = value 
    End Set 
End Property 

Public Property Type() As String 
    Get 
     Type = p_Type 
    End Get 
    Set(value As String) 
     p_Type = value 
    End Set 
End Property 

Public Property Genre() As String 
    Get 
     Genre = p_Genre 
    End Get 
    Set(value As String) 
     p_Genre = value 
    End Set 
End Property 

Sub New(ByVal name As String, ByVal type As String, ByVal genre As String) 
    Me.Name = name 
    Me.Genre = genre 
    Me.Type = Type 
End Sub 
End Class 
+0

это должно работать нормально, пока 'p' является экземпляром' PlayList'. Может быть, показать, как определен 'Playlist_element' – Plutonix

+0

Да p является экземпляром плейлиста:' Dim p As New Playlist() ' – Tagzz

+0

Моя ошибка в том, что я инициализирую Playlist_serialize. Да, я знаю, что я изменил название на что-то другое, но ничего не делает. – Tagzz

ответ

0

Есть несколько вопросов, с тем, как Playlist_element закодирован. Сначала ваши искатели собственности ошибаются. Они должны вернуть поле подкладочный:

Public Property Name() As String 
    Get 
     ' this does nothing: 
     'Name = p_Name 
     Return p_Name 
    End Get 
    Set(value As String) 
     p_Name = value 
    End Set 
End Property 

Далее, я бы не использовать Type в качестве имени свойства, даже если вы можете. Если вы просверлите внутреннее исключение и просмотрите сообщение, он сообщает вам, что он не может сериализовать PlayList_element, потому что у него нет простого конструктора. Все сериализаторы требуют этого, потому что они не знают, как использовать:

Sub New(ByVal name As String, ByVal type As String, ByVal genre As String) 
    p_Name = name 
    p_Genre = genre 
    p_Type = type 
End Sub 

' add: 
Public Sub New() 

End Sub 

Должно работать нормально. Я хотел бы отметить, что по состоянию на VS2010, вы можете использовать авто Реализуемого свойство и пропустить много этого кода:

Public Class Element 

    Public Property Name() As String 
    Public Property Type() As String 
    Public Property Genre() As String 

    Sub New(name As String, type As String, genre As String) 
     _Name = name 
     _Genre = genre 
     _Type = type 
    End Sub 

    Public Sub New() 

    End Sub 
End Class 

VS обеспечивает «скрытое» подкладочное поле с _Name, _Genre и т.д.

+1

Спасибо! Это оно ! Теперь работает ! – Tagzz