• 締切済み

C# ハッシュテーブルを利用した住所録のデータ読み込み(デシリアライズ)

こんにちは。 C#を勉強し始めたばかりなのですが、一つの課題として、名前、家の電話番号、携帯電話番号、e-mailのデータの読み込み、追加、削除、リストの表示をハードディスク上に保存しながら扱うプログラムを作っています。 その中の、データの読み込み部分なのですが、実行すると、catch内のthrowの部分でエラーが出て強制終了してしまいます。どこがおかしいのかご教授いただけたらと思います。 環境は、MicroSoft Visual Studio 2005、言語はC#です。よろしくおねがいします。 private void Load_Click(object sender, EventArgs e) { Hashtable homephone = null; Hashtable cellphone = null; Hashtable email = null; FileStream fs = new FileStream(file1, FileMode.Open); try { BinaryFormatter formatter = new BinaryFormatter(); homephone = (Hashtable)formatter.Deserialize(fs); cellphone = (Hashtable)formatter.Deserialize(fs); email = (Hashtable)formatter.Deserialize(fs); } catch (SerializationException er) { this.listBox1.Items.Add("Failed to deserialize for loading items."); this.listBox1.Items.Add("Reason: " + er.Message); throw; } finally { fs.Close(); this.listBox1.Items.Add("Loading is done."); } foreach (DictionaryEntry de in homephone) { this.listBox1.Items.Add("" + de.Key); this.listBox1.Items.Add("Home Phone : " + de.Value); }

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>>throw;の一文を削除すればいいんじゃないかと思います。 >そうなのですが、それを実行すると、次のhomephoneのところでエラーが出るのです。 >その後いじっているのですが、どうやらthrowがどうこうというよりも、ファイルの形がよくないようです。 デシリアライズで例外が起こっているのだから当たり前じゃないですか・ 結合とか考えないで、ファイルに書き出す時に、上書で(1つのファイルで)保存したらどうでしょうか。 どういう風に追加の分を別ファイルで保存してやっているのかよくわからないため見当違いだったらすみません。

pooh_bear
質問者

お礼

そうです。上書き保存をしたいのですが、うまくできなくて。 起動する→過去データのローディング→データの追加&削除→保存(過去データ&追加・削除分) と言う流れなのですが、うまく上書きできません。 そのため、2つのファイルにそれぞれ、ローディング分、追加・削除分と書き出していました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>catch内のthrowの部分でエラーが出て強制終了してしまいます おかしいというより、catch 内で再スローしているからそれを外側でキャッチして処理していないのだったら例外で終了するのは当たり前だと思います。 throw; の一文を削除すればいいんじゃないかと思います。

pooh_bear
質問者

お礼

早速のご返答ありがとうございます。 >throw;の一文を削除すればいいんじゃないかと思います。 そうなのですが、それを実行すると、次のhomephoneのところでエラーが出るのです。 その後いじっているのですが、どうやらthrowがどうこうというよりも、ファイルの形がよくないようです。 file1は、表示したプログラムよりも前のところで file1="c:\\Documents and Settings\\デスクトップ\\DataFile.dat"; のように指定しているのですが、アプリケーションを一旦終了し、再起動させた際に前回までのデータを保持しなければならず、file1(前回までのデータ書き込み)とfile2(新しいデータ書き込み)の2つのファイルを持たせ、後でfile1の最後にfile2をそのまま書き込ませていたのですが、そうすると、ハッシュテーブルで書き込んだデータですから後で読み込みができなくなってしまい、throwのところでエラーが出ていたようです。 この2つのファイルをうまく結合させるには、どうしたらいいのでしょうか? 考えられることとしては、もう一つfile3をつくり、それぞれfile1とfile2のデータをデシリアライズしてからfile3に書き込むことでしょうか。

関連するQ&A