2016-05-17 109 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,如果您例如对结构进行反序列化,则这是相关的。对于课程无关紧要。