none
ユーザー設定のXMLクラス作成について RRS feed

  • 質問

  •  皆様お世話になります。

    XPpro C#2008で開発をしております。

    フォームのレイアウト情報や、フォントなどをXMLファイルに書き出して
    復元可能なアプリケーションを作成したいと考えております。

    XMLを使うにあたりappconfigなどがあることは知っているのですが、
    複数のフォームを扱う為、フォームごとにXMLファイルを作成したいと考えております。

    ここで下記サイトなどを参考にXMLの入出力クラスを作成できたらよいと思っているのですが・・・
    http://dobon.net/vb/dotnet/file/xmlserializer.html


    public class SampleClass
    {
        public int Number;
        public string Message;
    }

    class MainClass
    {
        public static void 書き込み()
        {
            //保存先のファイル名
            string fileName = @"C:\test.xml";
            //保存するクラス(SampleClass)のインスタンスを作成
            SampleClass cls = new SampleClass();
            cls.Message = "テストです。";
            cls.Number = 123;

            //XmlSerializerオブジェクトを作成
            //書き込むオブジェクトの型を指定する
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(
                    typeof(SampleClass));
            //ファイルを開く
            System.IO.FileStream fs =
                new System.IO.FileStream(fileName,
                    System.IO.FileMode.Create);
            //シリアル化し、XMLファイルに保存する
            serializer.Serialize(fs, cls);
            //閉じる
            fs.Close();
        }
       
        public static void 読み込み()
        {
            //保存元のファイル名
            string fileName = @"C:\test.xml";

            //XmlSerializerオブジェクトの作成
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(
                    typeof(SampleClass));
            //ファイルを開く
            System.IO.FileStream fs =
                new System.IO.FileStream(fileName,
                    System.IO.FileMode.Open);
            //XMLファイルから読み込み、逆シリアル化する
            SampleClass cls =
                (SampleClass) serializer.Deserialize(fs);
            //閉じる
            fs.Close();

        }
    }

    このクラスだと一つのXMLファイルにしか対応できないクラスですが

    これをXMLをN個作成したい時に対応できるクラスを作成できたらいいなと思います。

    違うXMLを作成したいと思った時に
    クラスの内容が変わるのは
    ファイルの名前と上記の例だとSampleClassだけが
    変わるのでこれに対応したクラスを作成したいのですが、
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(typeof(SampleClass));
    この部分の記述がtypeof(クラスの型)になっているのでこの部分を
    Object型みたいなものに変えられないかと思っているのですが、
    何か方法はあるのでしょうか?

    何か知恵がありましたらご教授いただけると助かります。

    2009年4月7日 7:51

回答

  • 2つヒントを。

    WinFormデザイナでFormのプロパティ「Localizable」をtrueにして生成されるコードをみると参考になりますが、ComponentResourceManager. ApplyResourcesメソッド が使えるかもしれません。そのものを使わなくても似たようなものをご自身で実装するとか。

    XmlSerializerの他にも.NET Framework 3.0から提供されているDataContractSerializerクラス があり、特に3.5(SP1でしたっけ?)での拡張で扱いやすくなっています。

    実際のところどこまでXMLに外出ししたいのかよくわからないのでこのぐらいのことしか言えません。
    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月9日 9:21
    • System.Type (typeof演算子の戻り値の型) を引数にとってしまう
    • 型部分をGenericを使って受け取るようにする

    私が思いついたのはこんなところです (共通でベースクラス,というのも考えたのですが,読み込みで結局どちらか使うので外しました)。

    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月7日 8:35
  • イメージしているフォームをFormデザイナで作成し自動生成されるInitializeComponent()の内容については確認されていますでしょうか?
    簡単なコントロールなら問題ありませんが、ものによっては初期化の仕方がまちまちで簡単にXMLからロード、では済まされない可能性もあります。
    またフォームのイベント処理についてはどのようにお考えでしょうか。

    その上でこういった用途にXAMLを使用するのはどうでしょうか?
    チュートリアル : Windows フォームでの Windows Presentation Foundation コントロールのホスト
    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月7日 10:06

すべての返信

    • System.Type (typeof演算子の戻り値の型) を引数にとってしまう
    • 型部分をGenericを使って受け取るようにする

    私が思いついたのはこんなところです (共通でベースクラス,というのも考えたのですが,読み込みで結局どちらか使うので外しました)。

    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月7日 8:35
  • イメージしているフォームをFormデザイナで作成し自動生成されるInitializeComponent()の内容については確認されていますでしょうか?
    簡単なコントロールなら問題ありませんが、ものによっては初期化の仕方がまちまちで簡単にXMLからロード、では済まされない可能性もあります。
    またフォームのイベント処理についてはどのようにお考えでしょうか。

    その上でこういった用途にXAMLを使用するのはどうでしょうか?
    チュートリアル : Windows フォームでの Windows Presentation Foundation コントロールのホスト
    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月7日 10:06
  • YuO様、佐祐理様

    ご回答ありがとうございました。



    佐祐理WPFはまだ使用した機会がないので勉強させていただきます。
    >ものによっては初期化の仕方がまちまちで簡単にXMLからロード、では済まされない可能性もあります。
    フォームがロードされた時にXMLの内容を確認して修正しようかと単純に考えておりました。
    もう一度再確認をしてみます。


    • System.Type (typeof演算子の戻り値の型) を引数にとってしまう
    • 型部分をGenericを使って受け取るようにする

     http://www.codeproject.com/KB/XML/xml_serializationasp.aspx

    このサイトのようなことですかね?

    Genericクラス、正直List<T>しか使ったことないので、MSDNを読んでみます^^;
    皆様ありがとうございました。

    2009年4月8日 6:37
  • 2つヒントを。

    WinFormデザイナでFormのプロパティ「Localizable」をtrueにして生成されるコードをみると参考になりますが、ComponentResourceManager. ApplyResourcesメソッド が使えるかもしれません。そのものを使わなくても似たようなものをご自身で実装するとか。

    XmlSerializerの他にも.NET Framework 3.0から提供されているDataContractSerializerクラス があり、特に3.5(SP1でしたっけ?)での拡張で扱いやすくなっています。

    実際のところどこまでXMLに外出ししたいのかよくわからないのでこのぐらいのことしか言えません。
    • 回答としてマーク sk7474 2009年4月22日 9:24
    2009年4月9日 9:21
  • こんにちは。中川俊輔です。

    YuOさん、佐祐理さん、回答ありがとうございます。

    さとさとさん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、YuOさん、佐祐理さんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年4月22日 9:26