私は1つの文字列としてRGBカラー値を符号化し、それ以下のタイプのためにIXmlSerializable
を実装:カスタムIXmlSerializableをXmlAttributeとして使用する方法は?
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のメンバー 『色』をシリアライズすることはできませんXmlAttribute /のXmlTextはIXmlSerializableを実装する型をエンコードするために使用することはできません。」}
属性としても機能させる方法はありますか?
ありがとうございました。私は2つの質問がある。まず、実装はどのように正しくないのですか?ドキュメントの中の例(http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx)によく似ています(コメント欄に説明があります)。もう1つは、この例ではXmlRoot属性ですか?それはどのような違いがありますか? –
正しいXMLを生成できない実装に関して、私は忘れていました。「フレームワークはラッパー要素を記述し、XMLライターを起動後に配置します。」私は答えを改めるつもりです。実際には、XmlSerializerによって推論できるようにXmlRootをそのまま残すことができますが、クラスのデフォルトのシリアル化動作をオーバーライドするときは、わかりやすくするために、通常はすべてのコンポーネントで行います。 – JamieSee
OPはカスタマイズ可能なXML属性を誰に作成するかを尋ねているので、私はダウン投票しました。 XML要素を生成しません。 –