トップ回答者
ColorとXmlSerializer

質問
-
Colorプロパティを含むクラスのシリアライズを考えています。
class Setting
{
:
MyColors colors;
:
}
class MyColors
{
:
Color top;
Color bottom;
:
}
背景としては、このようなSettingクラスがあって、色や各種設定情報を管理しています。
それぞれのフィールドに対して、パブリックなプロパティが定義されています。
やりたいことはSettingオブジェクトのシリアライズです。
Colorクラスはパブリックプロパティの用件を満たしていないので、XmlSerializerでシリアライズすることができません。
これを、解決する方法としてはどのようなものがありますでしょうか?
アドバイスをいただけると助かります。
また、MyColorsの各プロパティはプロパティグリッドでカラーを設定できるようにしたいと思っています。
今のところ考えられる方法は以下のようなものです。
・SettingオブジェクトのシリアライズにXmlSerializerを使わず、別の方法でシリアライズする。
・Colorフィールドに対応するプロパティをintのようなものにする。
プロパティグリッドの方でintをカラー設定できるような仕組みを作る。
どちらも、結構手間がかかってしまいそうな気がします。
Colorと文字列を変換するようなコンバータをXmlSerializerに認識させるような方法があれば最高なのですが・・・。
回答
-
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でした。
すべての返信
-
>諸農さん
レスありがとうございます。
>ISerializable インタフェースを実装することになると思います。
そのようですね。
今回のような例では、MyColorsだけXmlSerializerが使えないのです。
しかし、シリアライズの対象はSettingです。
Settingには他にもいろいろとプロパティをもっています。
ISerializbleを実装する方法だと、Setting全体のシリアライズを自前で実装しなくてはならなくなりますね・・・。
プロパティにXmlSerializerに任せられないオブジェクトがひとつでもあると、全体のシリアライズを書かなくてはイケナイっていうのはどうかなぁ・・・、と思うのです。
-
[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 さんからの引用
[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でした。