我对泛型类的序列化有疑问。
因为我想为我的所有配置使用泛型类(它被序列化为XML),我编写了以下类:
Imports System.Xml
Imports System.Xml.Serialization
Imports System.IO
Imports System.Reflection
Imports System.Reflection.Assembly
<Serializable()> _
Public Class GenericConfig(Of T)
Public Sub WriteToFile(ByVal FileName As String)
ConfigVersion = ProgrammVersion.ToString
Dim XmlFile As FileStream = New FileStream(FileName, FileMode.Create)
Dim serialize As XmlSerializer = New XmlSerializer(GetType(GenericConfig(Of T)), New Type() {GetType(GenericConfig(Of T))})
serialize.Serialize(XmlFile, Me)
XmlFile.Close()
End Sub
Public Shared Function ReadFromFile(ByVal FileName As String) As GenericConfig(Of T)
Dim XmlFile As FileStream = New FileStream(FileName, FileMode.Open)
Dim serialize As XmlSerializer = New XmlSerializer(GetType(GenericConfig(Of T)))
ReadFromFile = serialize.Deserialize(XmlFile)
XmlFile.Close()
Return ReadFromFile
End Function
Public Shared ReadOnly Property ConfigFileName() As String
Get
Return GetExecutingAssembly.Location.Substring(0, GetExecutingAssembly.Location.Length - 4) & ".Config.xml"
End Get
End Property
End Class
Public Class ToolConfig
Inherits GenericConfig(Of ToolConfig)
Public Property Key1 As String = "Value 1"
End Class
我遇到的问题是我无法将其序列化,因为行
处存在以下错误serialize.Serialize(XmlFile, Me)
{&#34;不期望GenericConfigClass.ToolConfig类型。使用XmlInclude或SoapInclude属性指定静态未知的类型。&#34;}
如果你在派生类上使用XMLSerializer,我已经google了,发现了很多与该错误相关的文章。我不是在这里做的。我在泛型类上使用它。
除了在这里创建一个像这个人一样的XML帮助器类之外,还有其他方法: http://www.codeproject.com/Articles/35925/Generic-XML-Serialization-Methods
谢谢,
沃尔夫冈
更新
这就是我所说的(简短例子)
Imports System.IO
Public Class frmMain
Dim Config As ToolConfig
Private Sub btnConfigInit_Click(sender As Object, e As EventArgs) Handles btnConfigInit.Click
'----------------- read config file -----------------
If File.Exists(ToolConfig.ConfigFileName) Then
Config = ToolConfig.ReadFromFile(ToolConfig.ConfigFileName)
Else
Config = New ToolConfig
End If
Config.WriteToFile(ToolConfig.ConfigFileName)
MsgBox(Config.Key1)
End Sub
End Class
答案 0 :(得分:1)
是的, 使用派生类:ToolConfig
。通过XmlInclude
告知,你应该没问题:
将<XmlInclude(GetType(ToolConfig))>
添加到GenericConfig
。
另一种解决方案应该是在创建Me.GetType()
实例时简单地使用GetType(GenericConfig(Of T))
而不是XmlSerializer
:
Dim serialize As XmlSerializer = New XmlSerializer(Me.GetType())
为了能够成功反序列化,您必须使共享ReadFromFile
方法成为实例方法或使其成为通用方法。
如果要保持共享的反序列化方法,可以这样做:
Public Class GenericConfig ' <- No (Of T) here! But in the line below.
Public Shared Function ReadFromFile(Of T)(ByVal FileName As String) As T
Dim XmlFile As FileStream = New FileStream(FileName, FileMode.Open)
Dim serialize As XmlSerializer = New XmlSerializer(GetType(T))
ReadFromFile = serialize.Deserialize(XmlFile)
XmlFile.Close()
Return ReadFromFile
End Function
End Class
用法:
GenericConfig.ReadFromFile(Of ToolConfig)(filename)