ジェネリック クラスのシリアル化について質問があります。
すべての構成 (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)
{"タイプ GenericConfigClass.ToolConfig は予期されていませんでした。XmlInclude または SoapInclude 属性を使用して、静的に認識されていないタイプを指定してください。"}
派生クラスで XMLSerializer を使用すると、そのエラーに関連する記事がたくさん見つかりました。私はここでそれをしていません。ジェネリッククラスで使用しています。
この仲間のような 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