20

System.Drawing.Color オブジェクトは明らかに XmlSerializer でシリアル化されません。色をxmlでシリアル化する最良の方法は何ですか?

4

4 に答える 4

33

最も簡単な方法は、これを中心に使用します。

String HtmlColor = System.Drawing.ColorTranslator.ToHtml(MyColorInstance);

色が何であれ、HTMLで使用される標準の16進文字列に変換するだけで、次を使用して簡単に逆シリアル化できます。

Color MyColor = System.Drawing.ColorTranslator.FromHtml(MyColorString);

そうすれば、沼地の標準的な文字列で作業しているだけです...

于 2008-12-17T22:21:50.447 に答える
18

最終作業バージョン:

Color clrGrid = Color.FromArgb(0, 0, 0);
[XmlIgnore]
public Color ClrGrid 
{
    get { return clrGrid; }
    set { clrGrid = value; }
}
[XmlElement("ClrGrid")]
public string ClrGridHtml
{
    get { return ColorTranslator.ToHtml(clrGrid); }
    set { ClrGrid = ColorTranslator.FromHtml(value); }
}
于 2008-12-18T00:32:14.303 に答える
14

これを使用します:

[Serializable]
public struct ColorEx
{
    private Color m_color;

    public ColorEx(Color color)
    {
        m_color = color;
    }

    [XmlIgnore]
    public Color Color
    { get { return m_color; } set { m_color = value; } }

    [XmlAttribute]
    public string ColorHtml
    { 
        get { return ColorTranslator.ToHtml(this.Color); } 
        set { this.Color = ColorTranslator.FromHtml(value); } }

    public static implicit operator Color(ColorEx colorEx)
    {
        return colorEx.Color;
    }

    public static implicit operator ColorEx(Color color)
    {
        return new ColorEx(color);
    }
}
于 2010-07-08T15:05:23.727 に答える
1

ARGB値をプロパティとして公開するColorの単純なラッパークラスを作成できます。from / to ARGB変換を使用して色に/から変換することができます(ドキュメントを参照)。何かのようなもの:

[Serializable] 
public class ColorWrapper
{
   private Color color;

   public ColorWrapper (Color color)
   {  
      this.color = color;
   }

   public ColorWrapper()
   {
    // default constructor for serialization
   }

   public int Argb
   { 
       get
       {
           return color.ToARGB(); 
       }
       set 
       {
           color = Color.FromARGB();
       }
   }
}

おそらく色のアクセサーも欲しいです!

この利点は、色をシリアル化する必要があるすべての場所でクラスを使用できることです。XMLを(任意のARGB整数ではなく)読み取り可能にしたい場合は、balabasterで説明されているようにto /fromHTMLメソッドを使用できます。

于 2008-12-17T22:26:07.270 に答える