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

ArrayListに入れたクラスオブジェクトの取り出し

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

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

ArrayListにクラスを入れてXML化(シリアライズ)をしました。
そこまでは成功しましたが、その後のデシリアライズに失敗してしまいました。

何かを忘れているのだとは思いますが、どうしても分かりません。
シリアライズしたデータも普通に出来ていました。
デシリアライズもできますが、ArrayListから1つのクラスを取り出す時に
「キャストが有効ではありません」とでます。
下のコードにエラー場所を書いています。
キャストの方法が違う?のかと思いますが、
どうかよければ教えて頂けないでしょうか。


Form1がDBDクラスを持ち、
DBDクラスがArrayListを持ち、
ArrayListの中にSMMクラスを入れて行く形になります。

使用クラス、シリアライズ、デシリアライズ、データの抽出に使う部分の
コードをおきます。

//SMMクラス
public class SMM{//ArrayListに入れるクラス
public string SMCD = "0";
public string Name = "A";
public SMM(){

}
}

//DBDクラス
public class DBD{
public ArrayList AL = new ArrayList();
public DBD(){
SMM SM = new SMM();
AL.add(SM);
}
public string GetSte(int i){//ArrayListからクラスを取り出す
  SMM SM = new SMM();
  SM = (SMM)AL[i]; ***************エラー場所***************
  return SM.SMCD;
}
}

//Form1中
private DBD DB = new DBD();

public void In(){//シリアライズ
System.IO.FileStream FileName = new System.IO.FileStream("Syouhin.xml",System.IO.FileMode.OpenOrCreate);
Type[] et = new Type[] {typeof(SMM)};
System.Xml.Serialization.XmlSerializer serialize_1;
serialize_1 = new System.Xml.Serialization.XmlSerializer(
typeof(DBD),et);
ystem.IO.StreamWriter writes1 = new System.IO.StreamWriter(FileName);
serialize_1.Serialize(writes1,DB);
FileName.Close();
}

public void Out(){//デシリアライズ
System.IO.FileStream FileName = new System.IO.FileStream("Syouhin.xml",System.IO.FileMode.OpenOrCreate);
Type[] et = new Type[] {typeof(SMM)};
System.Xml.Serialization.XmlSerializer serialize_2;
serialize_2 = new System.Xml.Serialization.XmlSerializer(typeof(DBD),et);
System.IO.StreamReader Reader2 = new System.IO.StreamReader(FileName);
DB.AL.Add(serialize_2.Deserialize(Reader2));
FileName.Close();
}


public void GetDate(){//データの取り出し
MessageBox.Show(DB.GetSte(0));
}
こんにちは。羅樹と申します。

> ArrayListにクラスを入れてXML化(シリアライズ)をしました。
> そこまでは成功しましたが、その後のデシリアライズに失敗してしまいました。

> public ArrayList AL = new ArrayList();


[System.Xml.Serialization.XmlArrayItem(typeof(SMM))] _
public ArrayList AL = new ArrayList()

としてみてください。
聖 羅樹さんありがとうございます。

聖さんから教えて頂いたタイプ指定と
もう1つ自分でコードを見直しておかしい点に気づき、直しました。

デシリアライズ時に

DB.AL.Add(serialize_2.Deserialize(Reader2));
と書いていたのを
DB = serialize_2.Deserialize(Reader2);
に変えたところうまく行きました。

そもそもDBDクラス自体シリアライズ対象にしてるのに
ArrayListに入れようとしているのが間違いでした。

どうもありがとうございました。
解決済み!

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