9

IXmlSerializableRGBカラー値を単一の文字列としてエンコードする以下のタイプを実装します。

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 に答える