tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列データの逆シリアル化で例外発生
記事No5746
投稿日: 2007/06/29(Fri) 11:54
投稿者ダンボ
> My.Settingはプロジェクト独立? - ダンボ 07/06/25-12:09 No.5703 )
の続きです。

「iniファイルはXMLに移行」することにし、Serializerクラスを利用しました。
(よねKENさんおっしゃるとおり簡単ですね。データ構造クラスを定義して読み書きですか)
サンプルは下記から入手しました(DOBONさんありがとうございます)。
http://dobon.net/vb/dotnet/file/xmlserializer.html

で、配列データがない場合はうまく行くのですが、配列Folders()を追加すると、書き込みOK・読み込み例外
が起きてしまいます。どこが悪いか分からないので、皆さんご指摘お願いします。

    Public Class CommonData
        Public VER As String 'App Version
        Public Sort As Short 'Sort type
        Public PopUp As Short 'Popup speed
        Public EForm As Short 'Explorer Form
        Public DForm As String 'Date Form
        Public OForm As String 'Order Form
        Public Folders() As String 'Registered Folders
        Sub New()       'Constructor
            VER = "2.0"
            Sort = 1
            PopUp = 1
            EForm = 1
            DForm = "YYYYMMDD"
            OForm = "000"
            Folders = Nothing
        End Sub
    End Class
    Public IniData As CommonData

    Public Function ReadIni() As CommonData
        Dim Inifile As String ' 初期設定ファイルパス
        Inifile = My.Application.Info.DirectoryPath & "\DEF.xml"
        If PathFileExists(Inifile) = 0 Then
            IniData = New CommonData
        Else
            Dim Serializer As _
                New System.Xml.Serialization.XmlSerializer(GetType(CommonData))
            Dim FS As New System.IO.FileStream(Inifile, System.IO.FileMode.Open)
            IniData = CType(Serializer.Deserialize(FS), CommonData)
            FS.Close()
        End If

   Public Function WriteIni() As Boolean
        Dim Inifile As String ' 設定ファイルパス
        Inifile = My.Application.Info.DirectoryPath & "\Def.xml"
        Try
            Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(CommonData))
            Dim FS As New System.IO.FileStream(Inifile, System.IO.FileMode.Create)
            Serializer.Serialize(FS, IniData)
            FS.Close()
        Catch ex As Exception
            MsgBox("AA")
        End Try

書き込まれたDef.xmlの内容。(ReadIniで読ませると例外発生します)
<?xml version="1.0"?>
<CommonData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <VER>1.0.18216</VER>
  <Sort>0</Sort>
  <PopUp>1</PopUp>
  <EForm>0</EForm>
  <DForm>YYYYMMDD</DForm>
  <OForm>000</OForm>
  <Folders>
    <string>0=Folder0</string>
    <string>1=Folder1</string>
    <string>2=Folder2</string>
    <string>3=Folder3</string>
  </Folders>
</CommonData>

[ツリー表示へ]
タイトル[解決]配列データの逆シリアル化で例外発生
記事No5751
投稿日: 2007/06/29(Fri) 16:20
投稿者ダンボ
1行づつ実行しているうちに、異常に気がつきました。
    Public Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal lpszPath As String) As Integer

        If PathFileExists(Inifile) = 0 Then
を実行後にInifileの内容が壊れる!!

そこで、API使用をやめてフレームワークを使用して
        If System.IO.File.Exists(Inifile) Then
とすると、すべてOKでした。

#移行方針に追加:APIは全部、対応するフレームワーククラスを探して置き換える!

[ツリー表示へ]