DOBON.NET DOBON.NETプログラミング掲示板過去ログ

XMLの逆シリアルかについて

環境/言語:[C#です]
分類:[.NET]

public class DATA
{
    public int YEAR1;
    public int MONTH1;
    public int DAY1;
    public int YEAR2;
    public int MONTH2;
    public int DAY2;
    public int HOUR1;
    public int MINUTE1;
    public int HOUR2;
    public int MINUTE2;
    public string ACT;
    public string PLACE;
    public string MEMO;
}
としていて、
//保存元のファイル名
string fileName = @"C:\data\" + year + "_" + month + "_" + label2.Text + ".xml";

if (fileName.Length > 0)
{
    try
    {
        //XmlSerializerオブジェクトの作成
        XmlSerializer serializer = new XmlSerializer(typeof(DATA));
        //ファイルを開く
        FileStream fs = new FileStream(fileName, FileMode.Open);
        //XMLファイルから読み込み、逆シリアル化する
        DATA file = (DATA)serializer.Deserialize(fs);

        //閉じる
        fs.Close();
    }
    catch (FileNotFoundException d)
    {
        Console.WriteLine(d.FileName + "is not found!");
    }
}
else
{
    Console.WriteLine("EROOR");
}

このようにして逆シリアルかを行おうとしました。
上のほうにあるDATAクラスのの形でXMLファイルにデータ保存しています。
だいぶ省いていますが、この部分が重要だと思うところのみを載せます。

DATA file = (DATA)serializer.Deserialize(fs);
の部分で、InvalidOperationExceptionはハンドルされませんでした。
とデバッガに引っかかってしまいます。

どなたかご存知の方がいましたらよろしくお願いします。
これだけでは特定できないかもしれません。
もうちょっと情報を出せませんか?

・シリアライズ(シリアル化)する部分は示せますか?
・InvalidOperationExceptionには何かエラーメッセージが書かれていませんか?
例えば「XML ドキュメント (12,22) でエラーが発生しました。」みたいなメッセージです。
すみません…何を書けばいいのかわかりませんでした。

//XMLファイルに保存するオブジェクトのためのクラス
public class Data
{
    public decimal YEAR1;
    public decimal MONTH1;
    public decimal DAY1;
    public string HOUR1;
    public string MINUTE1;
    public decimal YEAR2;
    public decimal MONTH2;
    public decimal DAY2;
    public string HOUR2;
    public string MINUTE2;
    public string ACT;
    public string PLACE;
    public string MEMO;
}

public Insert()
{
   InitializeComponent();
}

private void Insert_Load(object sender, EventArgs e)
{
            
}

/*追加ボタンを押したとき*/
private void button1_Click(object sender, EventArgs e)
{

//保存先のファイル名
    string fileName = @"C:\data\" + year1.Value + "_" + month1.Value + "_" +  day1.Value + ".xml";
    //保存するクラス(SampleClass)のインスタンスを作成
    Data d = new Data();
    d.YEAR1 = year1.Value;
    d.MONTH1 = month1.Value;
    d.DAY1 = day1.Value;
    d.HOUR1 = hour1.Text;
    d.MINUTE1 = minute1.Text;
    d.YEAR2 = year2.Value;
    d.MONTH2 = month2.Value;
    d.DAY2 = day2.Value;
    d.HOUR2 = hour2.Text;
    d.MINUTE2 = minute2.Text;
    d.ACT = Act.Text;
    d.PLACE = place.Text;
    d.MEMO = memo.Text;

    //XmlSerializerオブジェクトを作成
    //書き込むオブジェクトの型を指定する
    System.Xml.Serialization.XmlSerializer serializer =new  System.Xml.Serialization.XmlSerializer(typeof(Data));
    //ファイルを開く
    System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create);
    //シリアル化し、XMLファイルに保存する
    serializer.Serialize(fs, d);
    //閉じる
    fs.Close();
}

という風にシリアルかしています。
今が実験環境にいないためコンパイルできないので、エラーメッセージがかけません…すみません…
ただ、(2,2)という風になっていたのを覚えています。
えーと、一つ目の投稿とあわせると、Data 型をシリアライズして DATA 型としてデシリアライズしようとしてるわけですか? 各メンバの型すら違うのに。
Hongliangさんありがとうございます。

すみません…すっかり見落としてました(汗
クラスの名前をそろえたらできました。
解決済み!
またなのですが、よろしくお願いします。

複数のデータを格納してデータを表示させようとしました。
public class Data
{
    public decimal YEAR1;
    public decimal MONTH1;
    public decimal DAY1;
    public string HOUR1;
    public string MINUTE1;
    public decimal YEAR2;
    public decimal MONTH2;
    public decimal DAY2;
    public string HOUR2;
    public string MINUTE2;
    public string ACT;
    public string PLACE;
    public string MEMO;

    public Data()
    {

    }
    public Data(decimal YEAR1, decimal MONTH1, decimal DAY1, string HOUR1, string MINUTE1, decimal YEAR2, decimal MONTH2, decimal DAY2, string HOUR2, string MINUTE2, string ACT, string PLACE, string MEMO)
    {
        this.YEAR1 = YEAR1;
        this.MONTH1 = MONTH1;
        this.DAY1 = DAY1;
        this.HOUR1 = HOUR1;
        this.MINUTE1 = MINUTE1;
        this.YEAR2 = YEAR2;
        this.MONTH2 = MONTH2;
        this.DAY2 = DAY2;
        this.ACT = ACT;
        this.PLACE = PLACE;
        this.MEMO = MEMO;
    }
}

に格納していて、

listBox1.Items.Clear();

Data[] data = new Data[10];

//保存元のファイル名
string fileName = @"C:\data\" + year + "_" + month + "_" + day + ".xml";
System.IO.FileInfo fInfo = new System.IO.FileInfo(fileName);

if (fInfo.Exists)
{
    //保存した内容を復元する
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Data[]));
    System.IO.FileStream fs = new System.IO.FileStream(fileName,System.IO.FileMode.Open);

    data = (Data[])serializer.Deserialize(fs);//←ここでエラー

    //復元した内容を表示する
    foreach(Data file in data)
    {
        listBox1.Items.Add(file.HOUR1 + ":" + file.MINUTE1 + "〜" + file.HOUR2 + ":" + file.MINUTE2 + " " + file.ACT);
        }
        fs.Close();

    }
    else 
    {
        listBox1.Items.Add("norhing...");
    }

で表示させようとしました。
InvaildOperationExceptionはハンドルされませんでした。XML ドキュメント (2,2) でエラーが発生しました。
とデバッグに引っかかります。

データ挿入時には、
//XMLファイルに保存するオブジェクトのためのクラス
public class Schedule
{
    public Data Data;

    public Schedule() 
   {
            
    }

    public Schedule(Data Data)
    {
         this.Data = Data;
    }
}
というクラスも使っています。

またなのですが、わかりません…
よろしくお願いします。
Data型とData[]型は違うものです
違う型のものを逆シリアル化することはできません。

以下のいずれかで考えてみて下さい。

・1個ずつ逆シリアル化して、Data[]型の要素に移していくか
・Data[]型の要素にまとめてから、シリアル化する
Azuleanさん ありがとうございます。

そうなんですか…
一緒のものだと考え、格納しようとしていました。
シリアル化はあまり触りたくないので、前者の方向で考えたいと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板