アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。
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) でエラーが発生しました。
です。
どこに問題があるのでしょうか。

A 回答 (2件)

すみません.私のところでもう一回実行してみましたが,やはり出ました...



ソースにブレークポイントを適当に設定して追ってみました.
すると,推測ですが,
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
    • good
    • 0

恐らくシリアライズ


がうまくいっていないのでは.
(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

参考URL:http://dobon.net/vb/dotnet/file/xmlserializer.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

やってみましたが同じエラーが出ます。
シリアライズするとちゃんとXMLファイルが作成され、中身もXMLの文法的にはまったく問題ないものができています。

お礼日時:2005/04/22 18:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!