gpt4 book ai didi

c# - Color 结构的最优雅的 XML 序列化

转载 作者:IT王子 更新时间:2023-10-29 04:01:54 26 4
gpt4 key购买 nike

有一个问题困扰着我,让我在 Stack Overflow 上注册。目前,如果我想将 Color 序列化为名为 color 的 XML 字符串,或者 #rrggbb,或者 #aarrggbb,我会这样做:

[XmlIgnore()]
public Color color;

[XmlElement(ElementName = "Color")]
public String color_XmlSurrogate
{
get { return MyColorConverter.SetColor(color); }
set { color = MyColorConverter.GetColor(value); }
}

这里 MyColorConverter 以我喜欢的方式进行序列化。但这一切感觉就像是一场大乱斗,还有额外的领域等等。有没有办法让它在更少的行中工作,也许将 TypeDescriptor 与与 XML 相关的 C# 属性连接起来?

最佳答案

这是我用来序列化 XML 中的 Color 结构的东西。在我看来,这比隐藏主要的 Color 属性要好。欢迎提出任何建议。

XmlColor 类主要依赖于隐式运算符 语言功能来提供关键数据转换。没有这个,这个类基本上是无用的。添加了其他一些功能来完善类(class)。

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

关于c# - Color 结构的最优雅的 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3280362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com