Вот что я использую для сериализации структуры Color
в XML. По моему мнению, это лучше, чем дублирование основного свойства Color
. Любые предложения приветствуются.
Класс XmlColor
опирается главным образом на языковую функцию implicit operator
, чтобы обеспечить ключевые преобразования данных. Без этого класс в основном бесполезен. Другие дополнения были добавлены в класс.
Помощник XmlColor
также предоставляет удобный способ разделения цветовых компонентов. Я добавил Alpha
свойство, чтобы показать это. Обратите внимание, что компонент Alpha
не будет сериализован, если он вращается до 255.
Десериализация значения цвета Web
объединяет значение Alpha
, сохраненное в данный момент в экземпляре. Порядок, в котором анализируются атрибуты, не должен иметь значения. Если в источнике XML отсутствует атрибут Alpha
, значение компонента экземпляра будет использоваться для установки уровня Alpha
. Это возможно ошибочно; однако в случае сериализации XML класс XmlColor
будет инициализирован с Color.Black
, установив для Alpha
значение 255.
Я работаю в среде VS2010 и работаю с .Net 4. Я понятия не имею, насколько код совместим с предыдущими версиями.
Вот пример свойства, которое должно быть сериализовано в XML:
[XmlElement(Type=typeof(XmlColor))]
public Color MyColor { get; set; }
Вот вспомогательный класс XmlColor
:
public class XmlColor
{
private Color color_ = Color.Black;
public XmlColor() {}
public XmlColor(Color c) { color_ = c; }
public Color ToColor()
{
return color_;
}
public void FromColor(Color c)
{
color_ = c;
}
public static implicit operator Color(XmlColor x)
{
return x.ToColor();
}
public static implicit operator XmlColor(Color c)
{
return new XmlColor(c);
}
[XmlAttribute]
public string Web
{
get { return ColorTranslator.ToHtml(color_); }
set {
try
{
if (Alpha == 0xFF) // preserve named color value if possible
color_ = ColorTranslator.FromHtml(value);
else
color_ = Color.FromArgb(Alpha, ColorTranslator.FromHtml(value));
}
catch(Exception)
{
color_ = Color.Black;
}
}
}
[XmlAttribute]
public byte Alpha
{
get { return color_.A; }
set {
if (value != color_.A) // avoid hammering named color if no alpha change
color_ = Color.FromArgb(value, color_);
}
}
public bool ShouldSerializeAlpha() { return Alpha < 0xFF; }
}