お世話になっております。
標題の通り、VB.NETにおける「xmlファイル」シリアライズにてご教示いただけませんでしょうか。
別クラスから呼び出された、シリアライズメソッドの処理において
xmlファイルの値が空白だったり書式がおかしかった際に、
下記ソースコードの「Dim obj As T = DirectCast(serializer.Deserialize(sr), T)」部分でエラーが出ます。
エラー内容:
例外がスローされました: 'System.InvalidOperationException' (System.Xml.dll の中)
追加情報:XML ドキュメント (11,3) でエラーが発生しました。
型?のエラーなのかとは思うのですが、
このエラーをtry~CatchでうまくCatchできません。
お手数ですが、Catchがうまくいく方法、もしくは別の方法がありましたら、ご教示願います。
開発環境は以下となります。
・Visual Studio 2015
・.NET Framework 4.7
VB.NET
1該当クラス 2 3Public Function xmlRead(Of T)(ByVal p_xmlFilePath As String) As Object 4 Try 5 'XmlSerializerオブジェクトを作成 6 Dim serializer As New System.Xml.Serialization.XmlSerializer( 7 GetType(T)) 8 9 '読み込むファイルを開く 10 11 If System.IO.File.Exists(p_xmlFilePath) Then 12 Dim sr As New System.IO.StreamReader( 13 p_xmlFilePath, New System.Text.UTF8Encoding(False)) 14 15 16 'XMLファイルから読み込み、逆シリアル化する 17 Dim obj As T = DirectCast(serializer.Deserialize(sr), T) 18 19 'ファイルを閉じる 20 sr.Close() 21 Return obj 22 Else 23 '読み込むファイルがない場合の、エラー処理 24 Throw New System.IO.FileNotFoundException 25 End If 26 27 Catch ex As Exception 28 Throw New Exception 29 End Try 30 31 32別クラス 33 34Try 35 g_XmlObj = util.xmlRead(Of Property)(XmlFileName) 36 37 Catch ex As Exception 38 Me.Close() 39 40 End Try
コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは?
開発環境(Visual Studio のバージョン、.NET Framework or Core のどっちかとそのバージョンなど)を書いてください。
ご指摘ありがとうございます。
インデント追加させていただきました。
開発環境は以下となります。
・Visual Studio 2015
・.NET Framework 4.7
> 開発環境は以下となります。
質問欄を編集して追記するようお願いします。コメント欄は初期画面では開いてないので見ない人がいますので。
> このエラーをtry~CatchでうまくCatchできません。
コードを見ると Exception をキャッチして、即 Throw New Exception としていますが、そのせいということはありませんか?
ご指摘ありがとうございます。
Throwで投げていたところを外せ場、想定通りの動作となりました。
> Throwで投げていたところを外せ場、想定通りの動作となりました。
対症療法的にはそれでもいいかもしれませんが、できればデシリアライズで例外をスローさせないで、デシリアライズする前に「xmlファイルの値が空白だったり書式がおかしかった」という部分を何とかした方が良いと思うのですか。
あと、Exception を catch して問題を握りつぶしてしまうのは好ましくないです。Exception を catch すると本来そこでアプリを停止すべき重大な問題まで握りつぶしてしまうことになりますから。そこも考えた方がよさそうです。
ご指摘ありがとうございます。
仰る通り、根本原因を解決しないといけませんね。
上司、先輩に質問してみます。
このスレッドの質問はとりあえず解決したようですので、質問者さんの方で回答欄に解決した方法を書いてこのスレッドはクローズしていただくようお願いします。
回答1件
あなたの回答
tips
プレビュー