C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 独自コレクションクラスをXMLファイルに書込したい


(過去ログ 106 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■63109 / inTopicNo.1)  独自コレクションクラスをXMLファイルに書込したい
  
□投稿者/ ホエホエ (1回)-(2012/07/18(Wed) 15:35:32)

分類:[.NET 全般] 

いつもお世話になっております、ホエホエです。

タイトルにもありますが、CollectionBaseクラスを派生し
Info構造体をリストに格納し、名称等のメンバ変数を持つ
独自コレクションクラスを作成し、XML書込をWriteメソッドで
行おうと思ったのですが、リストの中身の各Info構造体は
書込まれるんですが、InfoCollectionクラス自身が持つ
メンバ変数「m_strName」の内容がXMLファイルに出力されません。

意図的にメンバ変数をXML出力対象から省く属性はあるようですが
特に何も属性を記載しなければ書込みになると思ったのですが…

とりあえず以下にコードを記載させていただきます。

[Serializable]
public struct Info
{
    public int      nA;
    public double   dB;
    public string   strC;
}

public class InfoCollection : CollectionBase
{
    protected string m_strName = "";

    public string Name
    {
        get{ return m_strName;  }
        set{ m_strName = value; }
    }


    protected InfoCollection()
    {
    }
    public InfoCollection( string p_strName ) : this()
    {
        m_strName = p_strName;
    }

    public int Add( Info p_AddInfo )
    {
        return InnerList.Add( p_AddInfo );
    }

    public Info this[int index]
    {
        get { return (Info)InnerList[index]; }
        set { InnerList[index] = value; }
    }

    public bool Write( string p_strPath )
    {
        bool bRet = false;
        FileStream fs = null;

        try
        {
            fs = new FileStream( p_strPath, FileMode.Create, FileAccess.Write );
            System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer( typeof( InfoCollection ) );
            xs.Serialize( fs, this );

            fs.Close();
            bRet = true;
        }
        catch
        {
            bRet = false;
        }
        finally
        {
            if( fs != null )
            {
                fs.Close();
            }
        }
        return bRet;
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        InfoCollection	listInfo = new InfoCollection( "情報リスト" );
        for( int nIndex = 0; nIndex < 10; nIndex++ )
        {
            Info AddInfo;
            AddInfo.nA = 100 + nIndex;
            AddInfo.dB = AddInfo.nA / 1000.0;
            AddInfo.strC = string.Format( "データ{0}", nIndex );
            listInfo.Add( AddInfo );
        }

        listInfo.Write( strPath );
    }
}

このコードで何か不足 or マズい部分があるのでしょうか?
ご存知の方、教えてください。

ちなみに環境は
WindowsXP SP3
VisualStudio2003 or 2008
です。

引用返信 編集キー/
■63110 / inTopicNo.2)  Re[1]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ tinq (1回)-(2012/07/18(Wed) 22:36:23)
http://msdn.microsoft.com/ja-jp/library/bdxxw552.aspx(XmlSerializer.Serialize メソッド)に

Serialize メソッドは、オブジェクトのパブリック フィールドおよびパブリックな読み書き可能プロパティを XML に変換します。 メソッド、インデクサー、プライベート フィールド、または読み取り専用プロパティは変換されません。 オブジェクトのパブリックとプライベート両方のフィールドとプロパティをすべてシリアル化するには、BinaryFormatter を使用します。

とあるようにXmlSerializerはpublicなフィールドやプロパティしか保存してくれないようです。
引用返信 編集キー/
■63111 / inTopicNo.3)  Re[2]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ Azulean (1回)-(2012/07/18(Wed) 23:10:37)
No63109 (ホエホエ さん) に返信
> タイトルにもありますが、CollectionBaseクラスを派生し
> Info構造体をリストに格納し、名称等のメンバ変数を持つ
> 独自コレクションクラスを作成し、XML書込をWriteメソッドで
> 行おうと思ったのですが、リストの中身の各Info構造体は
> 書込まれるんですが、InfoCollectionクラス自身が持つ
> メンバ変数「m_strName」の内容がXMLファイルに出力されません。

XmlSerializer クラスの説明に書いてありますね。
http://msdn.microsoft.com/ja-jp/library/swxzdhc0%28v=vs.90%29

> XmlSerializer は、IEnumerable または ICollection を実装するクラスは特別に対処します。

ですので、ほかに public なプロパティがあったとしてもケアされないのではないでしょうか。
コレクションはコレクションとしてだけの責務を持ち、Name は別に持つことも考えてみてください。


No63110 (tinq さん) に返信
> とあるようにXmlSerializerはpublicなフィールドやプロパティしか保存してくれないようです。

これに対しては Name プロパティで本来はクリアできるはずです。
引用返信 編集キー/
■63114 / inTopicNo.4)  Re[3]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ ホエホエ (3回)-(2012/07/19(Thu) 10:01:22)
tinqさん>
Azuleanさん>
ご返信ありがとうございます。

確認のためにCollectionBaseクラスの派生をせず派生なしのクラスとし、
List<Info>とstringをメンバ変数に持つクラスにしてみたところ、
問題なくリストの中身とstringがXML出力されました。

Azuleanさんが書かれた通り、コレクションクラスは他のクラスと違って
普通にはリストの中身しか出力されないのかもしれません。
もしかしたら何か方法があればありがたいのですが、難しいようであれば
上記のように派生のない完全オリジナル独自コレクションクラスで
やろうと思います。
引用返信 編集キー/
■63118 / inTopicNo.5)  Re[4]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ ホエホエ (4回)-(2012/07/20(Fri) 13:20:17)
結局コレクションクラスでXML出力するのは諦めて、
リストを持ったクラスに変更して解決?しました。

ご助言いただきありがとうございました。
解決済み
引用返信 編集キー/
■63122 / inTopicNo.6)  Re[5]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ Jitta (1回)-(2012/07/21(Sat) 21:38:37)
No63118 (ホエホエ さん) に返信
> 結局コレクションクラスでXML出力するのは諦めて、
> リストを持ったクラスに変更して解決?しました。
>
> ご助言いただきありがとうございました。

ん?
[Serializable]
public class HogeCollection : List<Hoge>

とか。
解決済み
引用返信 編集キー/
■63123 / inTopicNo.7)  Re[6]: 独自コレクションクラスをXMLファイルに書込したい
□投稿者/ Azulean (2回)-(2012/07/21(Sat) 23:26:01)
No63122 (Jitta さん) に返信
> ん?
> [Serializable]
> public class HogeCollection : List<Hoge>

それも、当初の質問内容(Name プロパティ経由で公開される m_strName が書き出されない)を満たしていません。念のため。

No63109 (ホエホエ さん) に返信
> リストの中身の各Info構造体は書込まれるんですが、InfoCollectionクラス自身が持つ
> メンバ変数「m_strName」の内容がXMLファイルに出力されません。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -