C#には二種類のColor構造体があり、情報にたどり着くのが手間だったのでまとめてみました。
以下、usingを使用していないので少し冗長なサンプルコードになっていますが、実際はusing System.Windows.Mediaを使ってます。
System.Drawing.Color 構造体
http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=JA-JP&k=k%28System.Drawing.Color%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k%28DevLang-csharp%29&rd=true
System.Windows.Media.Color 構造体
http://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=JA-JP&k=k%28System.Windows.Media.Color%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k%28DevLang-csharp%29&rd=true
従来のWindows Formsアプリケーション等で使用されているColor構造体であるSystem.Drawing.Colorとstring型との相互変換
// 従来の Color <-> string 変換 System.Drawing.Color winColor = System.Drawing.Color.FromArgb(255, 255, 0, 0); // to String string winColorString = winColor.ToString(); // from String System.Drawing.Color winColorSave = System.Drawing.ColorTranslator.FromHtml(winColorString);
WPFで使用されるColor構造体であるSystem.Windows.Media.Colorとstring型との相互変換
// WPFの Color <-> string 変換 System.Windows.Media.Color wpfColor = System.Windows.Media.Colors.Red; // to String string wpfColorString = wpfColor.ToString(); // from String System.Windows.Media.Color wpfColorSave = (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(wpfColorString);
Colorクラスはダイレクトにシリアライズすることが出来ませんが、これを使用すると、アクセサ内でstring型に変換するプロパティを作成してシリアライズすることが出来ます。シリアライズの時のみ使用して、普段はColor構造体を直接操作すれば処理オーバーヘッド無し。
以下のサイトをそのまま参考にしました。K.Takaokaさんのコードです。
https://social.msdn.microsoft.com/Forums/ja-JP/de34aa14-ea7b-4190-88a9-6cba0c7680ef/colorxmlserializer?forum=csharpexpressja
どうでもいいけど、K.Takaokaさんの回答がベストアンサーになっていないのがかわいそう。
[field:NonSerialized] private System.Windows.Media.Color winColor = System.Windows.Media.Colors.Red; //[DataMember] // エラーが出る(実際にやってみると出来たりするのが謎) [XmlIgnore] public System.Windows.Media.Color WinColor { get { return winColor; } set { winColor = value; } } [DataMember] [XmlElement] public string WinColorString { get { return WinColor.ToString(); } set { WinColor = (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(value); } }