ColorやFontのXMLシリアライズ のバックアップソース(No.1)

更新

[[公開メモ]]

* 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 を使えば簡単に行える。

このダミーのプロパティはエディタやプロパティエディタで表示されてほしくないので~
http://msdn.microsoft.com/ja-jp/events/dd285291.aspx ~
を参考に [EditorBrowsable(EditorBrowsableState.Never)] と [Browsable(false)] 
を付けておく。

ん?

[EditorBrowsable(EditorBrowsableState.Never)] が効いていないようにも思える???

* コメント [#m8c26860]

#article_kcaptcha

Counter: 18251 (from 2010/06/03), today: 2, yesterday: 0