[英]How to use a custom IXmlSerializable as an XmlAttribute?
我为下面的类型实现了IXmlSerializable
,它将RGB颜色值编码为单个字符串:
public class SerializableColor : IXmlSerializable
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
var data = reader.ReadString();
reader.ReadEndElement();
var split = data.Split(' ');
R = int.Parse(split[0]);
G = int.Parse(split[1]);
B = int.Parse(split[2]);
}
public void WriteXml(XmlWriter writer)
{
writer.WriteString(R + " " + G + " " + B);
}
}
由于它是单个字符串,我想将其存储为属性以节省空间。 但是只要我将[XmlAttribute]
添加到我的属性,我就会得到以下异常:
{“无法序列化SerializableColor类型的成员'Color'。XmlAttribute / XmlText不能用于编码实现IXmlSerializable的类型。”}
有没有办法让它作为一个属性工作?
遗憾地(并且奇怪地)根据此链接不可能http://connect.microsoft.com/VisualStudio/feedback/details/277641/xmlattribute-xmltext-cannot-be-used-to-encode-types-implementing-ixmlserializable
为了解决这个问题,我目前正在使用XmlIgnore属性隐藏复杂属性并通过另一个属性将其作为字符串公开
public class MyDto
{
[XmlAttribute(AttributeName = "complex-attribute")]
public string MyComplexPropertyAsString
{
get { return MyComplexMember.ToString(); }
set { MyComplexMember.LoadFromString(value); }
}
[XmlIgnore]
public MyComplexMember At { get; set; }
}
错误意味着它所说的。 在实现IXmlSerializable时,您无法使用这些XML序列化属性,因为IXmlSerializable希望完全自定义XML序列化。 如果要使用属性使类可以使用XmlSerializer进行序列化,则可以执行此操作。
[XmlRoot("SerializableColor")]
public class SerializableColor
{
[XmlAttribute("R")]
public int R { get; set; }
[XmlAttribute("G")]
public int R { get; set; }
[XmlAttribute("B")]
public int B { get; set; }
}
另外,为了实现XmlSerializable:
public void ReadXml(XmlReader reader)
{
string data = null;
reader.MoveToAttribute("Color");
if (reader.ReadAttributeValue())
{
data = reader.Value;
}
reader.ReadEndElement();
var split = data.Split(' ');
R = int.Parse(split[0]);
G = int.Parse(split[1]);
B = int.Parse(split[2]);
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("Color", R + " " + G + " " + B);
}
另一方面,如果您希望能够做的只是一个可逆的颜色的短字符串表示,请查看ColorTranslator类 。 特别是,请参阅FromHtml和ToHtml方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.