ColorやFontのXMLシリアライズ

(1967d) 更新

公開メモ

System.Xml.Serialization.XmlSerializer は TypeConverter に対応していない

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

System.Drawing.Font にはパラメータを持たないコンストラクタが含まれていないため、
これをシリアル化することはできません。

これは、XmlSerializer が TypeConverter 属性を正しく解釈してくれないためだ。

自前で変換する

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)]
が効いていないようにも思える???

コメント





Counter: 12368 (from 2010/06/03), today: 4, yesterday: 0