
プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。
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件)
- 最新から表示
- 回答順に表示
No.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
No.1
- 回答日時:
恐らくシリアライズ
がうまくいっていないのでは.
(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
回答ありがとうございます。
やってみましたが同じエラーが出ます。
シリアライズするとちゃんとXMLファイルが作成され、中身もXMLの文法的にはまったく問題ないものができています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.NET]クラスのシリアライズ...
-
Microsoft Access エラー 3051
-
動画保存形式変更
-
パソコンで変換した3gp
-
OCXのライセンス
-
ダウンロード不可PDFファイルは...
-
圧縮ファイルから復元
-
Access2003で「オブジェクト'○○...
-
D902isでフォルダができない
-
ExcelマクロでCSV読込み
-
batファイル処理でのテキストフ...
-
複数のテキストファイルをexcel...
-
バッチファイルが作成できない
-
ExcelVBAで、隠しフォルダにあ...
-
PHPOBjectのmultiByteTestAS1.f...
-
ヤフーのNYダウの過去データ...
-
フォルダ作成用バッチファイル...
-
テキストファイルの文字色に色...
-
【Excel VBA】PDFを作成して,...
-
文字列を昇順に並べ変える事が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Webサイト アプリのコンパイル他
-
[VB.NET]クラスのシリアライズ...
-
Visual Studio 2008について
-
App_Code配下のクラスをNUnitで...
-
ASP.NET 3.5 アプリのフォルダ構成
-
Visual Web Developer 2005 の...
-
Excelでdatファイルを作成??
-
複数のテキストファイルをexcel...
-
ダウンロード不可PDFファイルは...
-
バッチによるショートカットの...
-
【Excel VBA】PDFを作成して,...
-
Microsoft Access エラー 3051
-
バッチファイルが作成できない
-
VBAでファイルパスが長すぎてコ...
-
テキストファイルの文字色に色...
-
カスタムコントロールのOCAファ...
-
FFFTPでサーバに新規フォルダが...
-
フォルダ作成用バッチファイル...
-
FileExitsについて
-
Access2003で「オブジェクト'○○...
おすすめ情報