none
ColorとXmlSerializer RRS feed

  • 質問

  • Colorプロパティを含むクラスのシリアライズを考えています。

    class Setting
    {
       :
      MyColors colors;
       :
    }

    class MyColors
    {
        :
      Color top;
      Color bottom;
        :
    }


    背景としては、このようなSettingクラスがあって、色や各種設定情報を管理しています。

    それぞれのフィールドに対して、パブリックなプロパティが定義されています。


    やりたいことはSettingオブジェクトのシリアライズです。

    Colorクラスはパブリックプロパティの用件を満たしていないので、XmlSerializerでシリアライズすることができません。

    これを、解決する方法としてはどのようなものがありますでしょうか?

    アドバイスをいただけると助かります。


    また、MyColorsの各プロパティはプロパティグリッドでカラーを設定できるようにしたいと思っています。


    今のところ考えられる方法は以下のようなものです。

    ・SettingオブジェクトのシリアライズにXmlSerializerを使わず、別の方法でシリアライズする。

    ・Colorフィールドに対応するプロパティをintのようなものにする。
    プロパティグリッドの方でintをカラー設定できるような仕組みを作る。

    どちらも、結構手間がかかってしまいそうな気がします。


    Colorと文字列を変換するようなコンバータをXmlSerializerに認識させるような方法があれば最高なのですが・・・。

    2006年12月5日 7:39

回答

  • 諸農です。

    クラス独自でシリアライズ制御を行うのであればISerializable インタフェースを実装することになると思います。

    2006年12月5日 21:56
  • 青柳です。

    ISerializable は SerializableAttribute がついているクラスを BinaryFormatter、SoapFormatter なんかでシリアライズ/デシリアライズするときのものですね。

    XmlSerializer を使うときは IXmlSerializable でシリアライズ/デシリアライズの動作を変更できるみたいです。

    2006年12月6日 1:37
  •  K.Takaoka さんからの引用

    [XmlIgnore]
    public Color ForeColor
    {
      get { ... }
      set { ... }
    }
     
    [EditorBrowsable(EditorBrowsableState.Never)]
    [XmlElement("ForeColor")]
    public string ForeColorText
    {
      // 文字列との相互変換はお好みで
      get { return ColorTranslator.ToHtml(this.ForeColor); }
      set { this.ForeColor = ColorTranslator.FromHtml(value); }
    }

     
    みたいなのが定番だとおもいます。
    例では XmlElement にしていますが、 XmlAttribute 等、シリアライズしたい形式を指定できます。
    (bbcode の code の中、微妙に変だな)


    > K.Takaoka さん
    情報ありがとうございます!

    いいですね、この方法。

    IXmlSerializableの方法より手数が少なくラクです。

    多少インターフェースが冗長になってしまいますが、とくに問題はないでしょう。

    ちなみに、PropertyGridに表示させないためには、

    [Browsable(false)]

    の属性でOKでした。

    2006年12月7日 12:10

すべての返信

  • 諸農です。

    クラス独自でシリアライズ制御を行うのであればISerializable インタフェースを実装することになると思います。

    2006年12月5日 21:56
  • 青柳です。

    ISerializable は SerializableAttribute がついているクラスを BinaryFormatter、SoapFormatter なんかでシリアライズ/デシリアライズするときのものですね。

    XmlSerializer を使うときは IXmlSerializable でシリアライズ/デシリアライズの動作を変更できるみたいです。

    2006年12月6日 1:37
  • 諸農さん

    レスありがとうございます。

    ISerializable インタフェースを実装することになると思います。

    そのようですね。

    今回のような例では、MyColorsだけXmlSerializerが使えないのです。

    しかし、シリアライズの対象はSettingです。

    Settingには他にもいろいろとプロパティをもっています。

    ISerializbleを実装する方法だと、Setting全体のシリアライズを自前で実装しなくてはならなくなりますね・・・。

    プロパティにXmlSerializerに任せられないオブジェクトがひとつでもあると、全体のシリアライズを書かなくてはイケナイっていうのはどうかなぁ・・・、と思うのです。


    2006年12月6日 11:13
  • >青柳さん

    貴重な情報ありがとうございます!


    IXmlSerializableで制御できるのですね。

    ちょっと調べてみましたが、かなり細かくコントロールできるみたいです。

    これで、Colorを持っているオブジェクトを持っているオブジェクト(ややこしい^^;)のシリアライズもColorがからむ部分だけ書けばうまくいきそうです。

    ありがとうございます。

    2006年12月6日 11:16

  • [XmlIgnore]
    public Color ForeColor
    {
      get { ... }
      set { ... }
    }
     
    [EditorBrowsable(EditorBrowsableState.Never)]
    [XmlElement("ForeColor")]
    public string ForeColorText
    {
      // 文字列との相互変換はお好みで
      get { return ColorTranslator.ToHtml(this.ForeColor); }
      set { this.ForeColor = ColorTranslator.FromHtml(value); }
    }

     
    みたいなのが定番だとおもいます。
    例では XmlElement にしていますが、 XmlAttribute 等、シリアライズしたい形式を指定できます。
    (bbcode の code の中、微妙に変だな)
    2006年12月6日 18:21
  •  K.Takaoka さんからの引用

    [XmlIgnore]
    public Color ForeColor
    {
      get { ... }
      set { ... }
    }
     
    [EditorBrowsable(EditorBrowsableState.Never)]
    [XmlElement("ForeColor")]
    public string ForeColorText
    {
      // 文字列との相互変換はお好みで
      get { return ColorTranslator.ToHtml(this.ForeColor); }
      set { this.ForeColor = ColorTranslator.FromHtml(value); }
    }

     
    みたいなのが定番だとおもいます。
    例では XmlElement にしていますが、 XmlAttribute 等、シリアライズしたい形式を指定できます。
    (bbcode の code の中、微妙に変だな)


    > K.Takaoka さん
    情報ありがとうございます!

    いいですね、この方法。

    IXmlSerializableの方法より手数が少なくラクです。

    多少インターフェースが冗長になってしまいますが、とくに問題はないでしょう。

    ちなみに、PropertyGridに表示させないためには、

    [Browsable(false)]

    の属性でOKでした。

    2006年12月7日 12:10