ColorやFontのXMLシリアライズ の変更点
更新- 追加された行はこの色です。
- 削除された行はこの色です。
- プログラミング/C#/ColorやFontのXMLシリアライズ へ行く。
- プログラミング/C#/ColorやFontのXMLシリアライズ の差分を削除
[[公開メモ]]
* System.Xml.Serialization.XmlSerializer は TypeConverter に対応していない [#oa8107f4]
アプリケーションの設定情報などを保存するのに XmlSerializer
は便利なのだけれど、Font 型や Color 型のプロパティがあると
エラーになる。
System.Drawing.Font にはパラメータを持たないコンストラクタが含まれていないため、
これをシリアル化することはできません。
これは、XmlSerializer が TypeConverter 属性を正しく解釈してくれないためだ。
* 自前で変換する [#gff86573]
XmlSerializer 自身を書き換えてしまうのが正しい気もするのだけれど、
そこまでは手が回らないので、以下の方法で解決する。
LANG:C#(linenumber)
using System.Xml.Serialization;
using System.ComponentModel;
public class SomeClass
{
[XmlIgnore] // XmlSerializer から隠す
public Font DisplayFont { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
public string DisplayFontAsString {
get { return ConvertToString(DisplayFont); }
set { DisplayFont = ConvertFromString<Font>(value); }
}
public static string ConvertToString<T>(T value) {
return TypeDescriptor.GetConverter(typeof(T)).ConvertToString(value);
}
public static T ConvertFromString<T>(string value) {
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}
}
まず、エラーを回避するために Font 型のプロパティ DisplayFont に [XmlIgnore] を付けて
XmlSerializer から隠す。
そして、データ保存用のダミーのプロパティ DisplayFontAsString で Font
と文字列との変換を行う。
変換は TypeConverter を使えば簡単に行える。
1つ注意が必要なのは、ConvertToString<T>(T value) で
return TypeDescriptor.GetConverter(value).ConvertToString(value);
と書いていると、value が null の時に破綻するので、必ず typeof(T) とする。
このダミーのプロパティはエディタやプロパティエディタで表示されてほしくないので~
http://msdn.microsoft.com/ja-jp/events/dd285291.aspx ~
を参考に [EditorBrowsable(EditorBrowsableState.Never)] と [Browsable(false)]
を付けておく。
ん?
[EditorBrowsable(EditorBrowsableState.Never)] ~
が効いていないようにも思える???
* コメント [#m8c26860]
#article_kcaptcha
**LpculDzRRaEWvEw [#b43bef58]
>[Heru] (2013-01-06 (日) 21:08:14)~
~
Just cause it's silmpe doesn't mean it's not super helpful.~
//
#comment_kcaptcha
Counter: 20319 (from 2010/06/03),
today: 1,
yesterday: 4