2016-05-17 83 views
-1

我試圖序列化和反序列化vb.net中的一些數據。以下是我如何序列化數據;vb.net中的動態類型名稱

調用例程;

SaveData("Reports", GetType(List(Of reports)), allreports) 

該子本身;

Private Sub SaveData(ByVal loc As String, ByVal ttyyee As System.Type, ByVal data As Object) 
    Dim writer As New System.Xml.Serialization.XmlSerializer(ttyyee) 
    Dim file As New System.IO.StreamWriter(
     "c:\Data\" & loc & ".xml") 
    writer.Serialize(file, data) 
    file.Close() 
End Sub 

這似乎工作正常。但是,當我嘗試向後做同樣的事情時,我得到一個錯誤。這是代碼;

調用;

LoadData("Reports", GetType(List(Of reports)), allreports) 

The Sub;

Private Sub LoadData(ByVal loc As String, ByVal ttyyee As System.Type, ByVal data As Object) 
    Dim reader As New System.Xml.Serialization.XmlSerializer(ttyyee) 
    Dim file As New System.IO.StreamReader(
      "c:\Data\" & loc & ".xml") 

    data = CType(reader.Deserialize(file), ttyyee) 
End Sub 

的問題是則傳遞給函數的參數ttyyee。我得到的錯誤:

type ttyyee is not defined.

我打算用這個序列化和反序列化的一堆不同類型的,所以我不希望明確聲明它,而傳遞的類型如保存子。有任何想法嗎?所有的

+0

也許'list of'與它有關係。你有沒有嘗試創建另一個類,基本上是一個'報告列表'並通過 – Claudius

+0

@Claudius錯誤發生在我運行代碼之前(它不會像這樣編譯)。 – FraserOfSmeg

+0

隨機downvote沒有評論.... – FraserOfSmeg

回答

0

首先,你應該使用DirectCast而不是CType因爲除非你需要能夠以不同的對象之間的轉換,CType較慢,在某些情況下是「危險」的使用。

其次,您可以使用Generic Types指定類型。

泛型類型實現這樣的:

Sub blabla(Of T)(arg1, arg2, ...) 

哪裏T是您的泛型類型(這可能有任何名稱,但T是最常見的)。如果你想添加多個你只是繼續:

Sub blabla(Of T1, T2, TKey, ...)(arg1, arg2, ...) 

所以使用這個,你就必須指定要反序列化到你參數傳遞給方法之前類型:

Private Sub LoadData(Of T)(ByVal loc As String, ByRef data As T) 'T is the type you want to deserialize to. 
    Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(T)) 
    Dim file As New System.IO.StreamReader("c:\Data\" & loc & ".xml") 

    data = DirectCast(reader.Deserialize(file), T) 
End Sub 

用法示例:

LoadData(Of List(Of reports))("Reports", allreports) 

編輯:

我在代碼中添加了GetType(T) - 感謝Plutonix。我還將參數從ByVal更改爲ByRef,如果您例如對結構進行反序列化,則這是相關的。對於課程無關緊要。