- 締切済み
[VB.NET]クラスのシリアライズでエラーが発生
プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。 Public Class cde_config Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As New ArrayList Public Sub New() If File.Exists(CONFIG_FILE) Then Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Open) Try Me.FolderName = CType(serializer.Deserialize(stream), cde_config).FolderName 'ここでエラーが発生 Me.exex = CType(serializer.Deserialize(stream), cde_config).exex Finally stream.Close() End Try Else FolderName = "略" exex.Add(New String("略")) End If End Sub Public Sub save() Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Create) Try serializer.Serialize(stream, Me) Finally stream.Close() End Try End Sub End Class エラーの内容は 'System.InvalidOperationException' のハンドルされていない例外が system.xml.dll で発生しました。 追加情報 : XML ドキュメント (2,2) でエラーが発生しました。 です。 どこに問題があるのでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- naganaga_001
- ベストアンサー率71% (172/242)
すみません.私のところでもう一回実行してみましたが,やはり出ました... ソースにブレークポイントを適当に設定して追ってみました. すると,推測ですが, serializer.Deserialize(stream), cde_config) XmlSerializerがデシリアライズする際,↑の第2引数の型でインスタンス生成をしている為, cde_configのデフォルトコンストラクタが呼ばれて例外が発生しているみたいです. 設定情報を保持するクラスと,読込・保存を行うクラスを別にする方法しか思いつきませんでした... 蛇足ですが,私がコンソールアプリケーションで試しに作ってみたソースを貼っておきます. お役に立てなくてすみません. ==================================================== Imports System.IO Module Module1 Sub Main() Dim cls As cde_config Try If File.Exists(cde_config.CONFIG_FILE) Then Console.WriteLine("File:" + cde_config.CONFIG_FILE + "が見つかりました.") Console.WriteLine("File:" + cde_config.CONFIG_FILE + "を読込みます.") cls = cde_config_Reader.read() Console.WriteLine("File:" + cde_config.CONFIG_FILE + "を読込みました.") Else Console.WriteLine("File:" + cde_config.CONFIG_FILE + "が見つかりません.") Console.WriteLine("File:" + cde_config.CONFIG_FILE + "を生成します") cls = New cde_config cls.FolderName = "test" cls.exex.Add("TEST") cde_config_Reader.save(cls) Console.WriteLine("File:" + cde_config.CONFIG_FILE + "を生成しました.") End If Console.ReadLine() Catch ex As Exception End Try End Sub End Module Public Class cde_config Public Sub New() Me.exex = New ArrayList End Sub Public Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As ArrayList End Class Public Class cde_config_Reader 'シリアライズ Public Shared Sub save(ByVal cls As cde_config) Dim fs As System.IO.FileStream Try 'XmlSerializerオブジェクトを作成 '書き込むオブジェクトの型を指定する Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(cde_config)) 'ファイルを開く fs = New System.IO.FileStream(cde_config.CONFIG_FILE, System.IO.FileMode.Create) 'シリアル化し、XMLファイルに保存する serializer.Serialize(fs, cls) Catch ex As Exception Throw ex Finally If Not IsNothing(fs) Then fs.Close() End Try End Sub 'デシリアライズ Public Shared Function read() As cde_config Dim fs As System.IO.FileStream Dim cls As cde_config Try If Not File.Exists(cde_config.CONFIG_FILE) Then Return Nothing End If 'XmlSerializerオブジェクトの作成 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(cde_config)) 'ファイルを開く fs = New System.IO.FileStream(cde_config.CONFIG_FILE, System.IO.FileMode.Open) 'XMLファイルから読み込み、逆シリアル化する cls = CType(serializer.Deserialize(fs), cde_config) Return cls Catch ex As Exception Throw ex Finally If Not IsNothing(fs) Then fs.Close() End Try End Function End Class
- naganaga_001
- ベストアンサー率71% (172/242)
恐らくシリアライズ がうまくいっていないのでは. (Public Sub save()の serializer.Serialize(stream, Me)かな?) どぼん様を参考にやってみましたが,こんな感じですか? ================================== Imports System.IO Public Class cde_config Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As ArrayList Public Sub New() Try Dim cls As cde_config = Me.read() If Not IsNothing(cls) Then 'ファイルが存在した時 Me.FolderName = cls.FolderName '… Else 'ファイルが存在しない時 Me.FolderName = "略" '設定した値を保存するとか… Me.save() '… End If Catch ex As Exception Throw ex End Try End Sub 'ファイルが無い時用コンストラクタ Private Sub New(ByVal clar As Boolean) If clar Then Me.FolderName = "" Me.exex = New ArrayList End If End Sub 'シリアライズ Private Sub save() Dim fs As System.IO.FileStream Dim cls As cde_config = New cde_config(True) Try cls.FolderName = "test" 'XmlSerializerオブジェクトを作成 '書き込むオブジェクトの型を指定する Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(cde_config)) 'ファイルを開く fs = New System.IO.FileStream(Me.CONFIG_FILE, System.IO.FileMode.Create) 'シリアル化し、XMLファイルに保存する serializer.Serialize(fs, cls) Catch ex As Exception Throw ex Finally If Not IsNothing(fs) Then fs.Close() End Try End Sub 'デシリアライズ Private Function read() As cde_config Dim fs As System.IO.FileStream Dim cls As cde_config Try If Not File.Exists(Me.CONFIG_FILE) Then Return Nothing End If 'XmlSerializerオブジェクトの作成 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(cde_config)) 'ファイルを開く fs = New System.IO.FileStream(Me.CONFIG_FILE, System.IO.FileMode.Open) 'XMLファイルから読み込み、逆シリアル化する cls = CType(serializer.Deserialize(fs), cde_config) Return cls Catch ex As Exception Throw ex Finally If Not IsNothing(fs) Then fs.Close() End Try End Function End Class
お礼
回答ありがとうございます。 やってみましたが同じエラーが出ます。 シリアライズするとちゃんとXMLファイルが作成され、中身もXMLの文法的にはまったく問題ないものができています。