何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 35963
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

前回のあらすじ。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
コメント
タイトル
名前
Url
コメント