4

ジェネリック クラスのシリアル化について質問があります。

すべての構成 (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
4

1 に答える 1

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)
于 2013-03-04T12:28:15.370 に答える