XmlSerializer和System.Drawing.Color的最佳解决方案

时间:2008-12-17 22:15:35

标签: .net xml-serialization

System.Drawing.Color对象显然不会使用XmlSerializer进行序列化。 xml序列化颜色的最佳方法是什么?

4 个答案:

答案 0 :(得分:32)

最简单的方法是使用它的核心:

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

它只会将颜色转换为HTML使用的标准十六进制字符串,这很容易反序列化:

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

那样你只是在使用沼泽标准字符串......

答案 1 :(得分:17)

最终工作版本:

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); }
}

答案 2 :(得分:13)

我们用这个:

[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);
    }
}

答案 3 :(得分:1)

您可以为Color编写一个简单的包装类,将ARGB值公开为属性。您可以使用from / to ARGB转换来转换为/从颜色转换(请参阅docs)。类似的东西:

[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描述的来自/来自HTML的方法。