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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエラー発生アプリケーション mmc.exe

管理ツールのイベントログを見たり、保存したりすると、管理ツールが落ちてしまいます。
何とか、落ちながら保存された、イベントログには
「エラー発生アプリケーション mmc.exe、バージョン 5.1.2600.0、エラー発生モジュール mmcndmgr.dll、バージョン 5.1.2600.0、エラー発生アドレス 0x00054e27」
とあります。
何が壊れているんでしょうか。

Aベストアンサー

mmc.exeは管理ツール。mmcndmgr.dllはそのアイコン・ファイルのようですが。回答になっていませんね。
http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

参考URL:http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

QVBSでDim、Private、Publicの違い

Dim、Private、Publicの違いを教えてください。

どのように使え分けるのですか?

Aベストアンサー

VBSで、どの程度、使いこなせられるかにもよりますね。
一般のVB系の言語と違って、それらのステートメントは出会うことは少ないです。

Dim が入っているので、変数に対してのことだと思います。以下のように3つ並べてみて、その違いが分かるはずです。Dim と Public は、基本的には同じになります。ところが、Private は、呼び出せません。ただし、Function や Sub につけるキーワードは意味が変わります。

On Error Resume Next
Class myClass
Public FirstName
Private LastName
Dim Genr
Property Get FullName
Fullname = FirstName & " " & LastName & " " & Genr
End Property
Sub AddName(fname, lname, gnr)
Firstname = fname
LastName = lname
Genr = gnr
End Sub
End Class
Set Class1 = new myClass
Class1.Addname "Mari", "Yaguchi" ,"Talent"
MsgBox(class1.FirstName)
MsgBox(class1.LastName)
MsgBox(class1.Genr)
MsgBox(Err.Description)
'技術評論社 ポケットリファレンス『VBScript』p.42を参考

VBSで、どの程度、使いこなせられるかにもよりますね。
一般のVB系の言語と違って、それらのステートメントは出会うことは少ないです。

Dim が入っているので、変数に対してのことだと思います。以下のように3つ並べてみて、その違いが分かるはずです。Dim と Public は、基本的には同じになります。ところが、Private は、呼び出せません。ただし、Function や Sub につけるキーワードは意味が変わります。

On Error Resume Next
Class myClass
Public FirstName
Private LastName
Dim Genr
Property Get FullN...続きを読む

Q"mmc.exe"ってどんな働きをするのでしょうか?エラーメッセージが表示されるのですが...

本日2度ほど"mmc.exe"のアプリケーションエラーが発生しました。
表示メッセージは次のようなものでした。
"0x77a5db1"の命令が"0x72392d74"のメモリを参照しましたが、メモリが"read"になることはできませんでした。
発生したのはACCESS2000でテキストファイル(6MB位の大きいもの)にリンクを貼ろうとした際、ACCESSの反応がなくなっため、強制終了してからです。
何らかの修復をしなければならない重要なメッセージなのかどうかわからず質問させていただきました。
mmc.exeで検索したところ、2件ほどヒットしましたが、今回の私の事象とは異なったため、質問しました。
よろしくお願いします。

Aベストアンサー

mmcはMicrosoft Management Consoleです。
MSの検索でMMCで検索すれば何個か文献が出るでしょう。
ヘルプ見ても出てくるはずです。
コントロールパネルの管理ツール内のアプレットはたいていMMCのコンソール
だったはず。

解決策はやはりとりあえずSP2当てて様子を見るというのは(Windows2000ならば)。

参考URLはSP2のダウンロードページです。

参考URL:http://www.microsoft.com/japan/windows2000/downloads/servicepacks/sp2/default.asp

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

Qこのホ-ムペ-ジでの質問一覧画面がエラーで出ない

このホ-ムペ-ジですが
マイページ → 関心カテゴリーの質問一覧
を押してもエラ画面ーになり表示出てきません
自分の質問解答履歴は出ます
なぜエラーに ???
宜しくお願い致します

Aベストアンサー

エラーが続出していますね。
更新ボタンを押すと表示されることが多いです。

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

Qホームページビルダー11で通信エラー(エラーコード:553)がサイト転送時に出ます。

 こんにちは。ホームページビルダー11でサイト転送すると通信エラ
ー(エラーコード:553)が出て、フレーム表示のページも表示され
ていない状態になってしまいます。どうしたらよいですか?

Aベストアンサー

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不具合でもあるようですので、ファイル名に問題がない時は、サイト転送ではなくページ転送(FTP)や、フリーソフトのFFFTPなどを使って転送してみた後、ネット上で表示されるかどうか確認するのをおすすめします。

また、後日V11の修正ファイルがIBMで配布されると思いますので、たまに下記サイトをアクセスし、修正ファイルが公開されたらインストールされておかれてください。
http://www-06.ibm.com/jp/software/internet/hpb/

参考URL:http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不...続きを読む

QSub-EndでConsole.Writeでコマンドプロンプト出力したい

VB.NET2003:WindowApplication の Sub~End で 出力Console.Write("***") としてもコマンドプロンプトウィンドウにでないで、.NETウィンドウのデバッグ欄にしか出ない。前もって何かを指定しなければならないのでしょうが全くわかりません。ConsoleApplication ではうまくいっていますが。初心者なのでよろしくお願いします。

Aベストアンサー

Windows Applicationは,コンソールを持ちません。
# AllocConsole API等を使えば,専用コンソールを持てますが。

コンソールへ出力したいのであれば,Console Applicationにする必要があります。
なお,Console ApplicationであってもWindows Formsを開く事は可能です。

QWindows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラ

Windows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラーが出ました!全く意味がわかりません?

Aベストアンサー

windows10、windows10anniversary Updateに失敗をする場合は、
タスクトレイを開いてタブのスタートアップを開いて、すべてのアプリを無効にします。
次にもサービスを開いて、Microsoftの製品をすべて無効にします。

windows10 Creators Updateに失敗をする原因
http://freesoft.tvbok.com/win10/problems/trouble_shoot_list_creators_update.html

私のプロフィールにwindowsに関するURLを載せているので、必要な時にURLを開いて操作方法を確認してください。

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。


人気Q&Aランキング

おすすめ情報