Dia*_*cus 36 c# xml-serialization
一个问题让我足以在Stack Overflow上注册.目前,如果我想将Color to XML string序列化为命名颜色,或者#rrggbb
,或者#aarrggbb
,我这样做:
[XmlIgnore()]
public Color color;
[XmlElement(ElementName = "Color")]
public String color_XmlSurrogate
{
get { return MyColorConverter.SetColor(color); }
set { color = MyColorConverter.GetColor(value); }
}
Run Code Online (Sandbox Code Playgroud)
这MyColorConverter
是按照我喜欢的方式进行序列化.但所有这一切感觉就像一个kludge,有额外的领域和所有.有没有办法让它在更少的行中工作,可能将TypeDescriptor与与XML相关的C#属性连接起来?
bvj*_*bvj 62
这是我用于Color
在XML中序列化结构的东西.Color
在我看来,这比遮蔽主要财产更好.欢迎任何建议.
该XmlColor
班主要依赖implicit operator
语言功能来提供关键数据tranformations.没有这个,这个班基本没用.添加了其他功能以完善课程.
该XmlColor
助手还提供了一个方便的方法来分离颜色分量.我添加了Alpha
属性来显示这个.请注意,Alpha
如果组件一直转动到255,则不会将其序列化.
反序列化Web
颜色值组合了Alpha
当前存储在实例中的值.解析属性的顺序无关紧要.如果Alpha
XML源中缺少该属性,则将使用实例组件值来设置Alpha
级别.这可以说是错误的; 但是,在XML序列化的情况下,XmlColor
类将初始化为Color.Black
设置Alpha
为255.
我正在使用VS2010环境并构建.Net 4.我不知道代码与以前版本的兼容性如何.
这是一个应该序列化为XML的示例属性:
[XmlElement(Type=typeof(XmlColor))]
public Color MyColor { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是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; }
}
Run Code Online (Sandbox Code Playgroud)
小智 19
我相信下面我有一个更简单的解决方案.忽略颜色序列化并保存颜色并将其作为简单的32位ARGB数据加载.
[XmlIgnore]
public Color BackColor { get; set; }
[XmlElement("BackColor")]
public int BackColorAsArgb
{
get { return BackColor.ToArgb(); }
set { BackColor = Color.FromArgb(value); }
}
Run Code Online (Sandbox Code Playgroud)
痛苦,不是吗?XmlSerializer
除非你实施IXmlSerializable
(我不推荐),你可以做的就是这一切.选项:
color_XmlSurrogate
为[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
- 这将阻止它出现在大多数数据绑定视图中,并在代码编辑器中引用您的程序集作为DLLDataContractSerializer
,它支持私有属性(但不支持xml属性;你不能赢...)顺便说一下,我有color
一个属性,而不是一个字段:
[XmlIgnore]
public Color Color {get;set;}
Run Code Online (Sandbox Code Playgroud)