9

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 的类型。”}

有没有办法让它也作为一个属性工作?

4

2 回答 2

8

遗憾的是(奇怪的是)根据此链接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; }
}
于 2013-07-25T02:33:08.967 回答
6

错误的意思正是它所说的。当实现 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 方法。

于 2012-07-24T18:07:16.913 回答