ColorやFontのXMLシリアライズ のバックアップの現在との差分(No.1)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

* System.Xml.Serialization.XmlSerializer は TypeConverter に対応していない [#oa8107f4]

アプリケーションの設定情報などを保存するのに XmlSerializer 
は便利なのだけれど、Font 型や Color 型のプロパティがあると
エラーになる。

 System.Drawing.Font にはパラメータを持たないコンストラクタが
 含まれていないため、これをシリアル化することはできません。
 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)] が効いていないようにも思える???
[EditorBrowsable(EditorBrowsableState.Never)] ~
が効いていないようにも思える???

* コメント [#m8c26860]

#article_kcaptcha


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