前回のあらすじ。HTTP ベース サービスを利用して、XML ファイルを持ってくる、と決めた。
今回の目標。読み込む対象を決定する。
どんなデータが必要か、or あればよいかを考える。
まず、故障回数。まぁ、ログの件数を数えれば件数はできるから、いっか。累積稼働時間。これは必要。エラーコード。まぁ、必要。エラー内容を分類するかもしれないし。それと、メッセージ内容。要らないかもしれないけど、ログだし。
とりあえず、そんなところで。XML だし、後から追加できるから。
ということで、ログ1件のクラスは、こんな感じ。
class Warning
{
[XmlAttruibute]
public Int64 TotalRuntime() {
get;
set;
}
[XmlAttribute]
public Int64 ErrorCode() {
get;
set;
}
[XmlText]
public string LogMessage() {
get;
set;
}
}
<Warning TotalRuntime="Int64" ErrorCode="Int64">LogMessage</Warning>
そして、ログ ファイルは、この1件のログがたくさん集まっているわけだから、XML が、こんな感じ。
<?xml version="1.0" encoding="utf-8" ?>
<Log>
<List>
<Warning TotalRuntime="Int64" ErrorCode="Int64">LogMessage</Warning>
</List>
</Log>
このファイルのためのクラスは、次のようになる。
class LogList : List<Log>
{
// シリアル化のために必要
// 空クラス
}
class Log
{
public Log() {
List = new LogList();
}
[XmlArrayItem(typeof(Warning))]
public LogList List() {
get;
set;
}
}
あ、あっさりできた...
ここの注意点は、「[Xmlほにゃらら]」という、属性ですかね。XML の、要素なのか、属性なのか、内容なのか。それから、どんな型の配列なのか。その辺がきっちり押さえてあれば、よろしいかと。
それと、クラスに「[Serialize]」属性をつけなくて良いみたい。1.x の頃は必要だったけど、2.0 以降のどこかで不要になった?それとも、Silverlight では不要?
あれ?そうすると、LogList クラスも要らないかな?2.0 では、ジェネリックをシリアル化できなかったのだけど。。。
クラスの設計ができたので、それに沿った XML ファイルを作る。そして、配置する。作るのが面倒なときは、このクラスに適当なデータを放り込んで、シリアル化して作る。先にシリアル化しておくと、本当に望むとおりになっているか、確認もできる。
次、GetWarningLog メソッドの実装。
サンプル コードに、ストリームを取り出すところまで載っている。なので、真似すればいい。最後に、出力のところだけ、こっちに都合が良いように変えればいい、と。
#using System.Net;
#using System.IO;
#using System.Xml.Serialization;
private void GetWarningLog(IAsyncResult result) {
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
Stream stream = response.GetResponseStream();
try {
XmlSerializer serializer = new XmlSerializer(typeof(WarningLog));
WarningLog log = (WarningLog)serializer.Deserialize(stream);
textBox1.Text += ":resieved\n";
foreach (Warning w in log.WarningList) {
textBox1.Text += (w.ToString() + "\n");
}
} catch (Exception ex) {
textBox1.Text = ex.ToString();
}
}
実行してみる。ロードが終わって、ワンテンポ遅れて、テキスト ボックスに XML ファイルの内容らしきもの(ToString メソッドの実装に依存)が表示されれば OK。例外が発生した場合は、例外の内容がテキスト ボックスに書かれる。
ん~?Silverlight っちゅう感じがしないのはなぜ?
投稿日時 : 2008年6月6日 23:37