Лучшее решение для XmlSerializer и System.Drawing.Color - PullRequest
20 голосов
/ 18 декабря 2008

System.Drawing.Color объекты, очевидно, не будут сериализованы с XmlSerializer. Каков наилучший способ сериализации XML-цветов?

Ответы [ 4 ]

32 голосов
/ 18 декабря 2008

Самый простой метод использует это в своей основе:

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

Он просто преобразует любой цвет в стандартную шестнадцатеричную строку, используемую HTML, которая также легко десериализуется с помощью:

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

Таким образом, вы просто работаете со стандартными строками болота ...

17 голосов
/ 18 декабря 2008

Окончательная рабочая версия:

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); }
}
13 голосов
/ 08 июля 2010

Мы используем это:

[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);
    }
}
1 голос
/ 18 декабря 2008

Вы можете написать простой класс-оболочку для Color, который выставляет значения ARGB в качестве свойств. Вы можете переводить в / из цветов, используя преобразования из / в 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), вы можете использовать HTML-методы to / from, как описано в balabaster.

...