zaimplementować IXmlSerializable
dla danego typu, poniżej której koduje wartość koloru RGB jako jeden ciąg znaków:Jak używać niestandardowego IXmlSerializable jako 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);
}
}
Ponieważ jest to pojedynczy łańcuch, chciałam zapisać go jako atrybut celu zaoszczędzenia miejsca. Ale jak tylko dodać [XmlAttribute]
do mojego mienia, pojawia się następujący wyjątek: { „. Nie można szeregować członkowskiego«kolor»typu SerializableColor XmlAttribute/xmlText nie może być używany do kodowania rodzajów wykonawczych IXmlSerializable”}
Czy istnieje sposób, aby działało to również jako atrybut?
Dziękuję za odpowiedź. Mam jednak dwa pytania. Po pierwsze, w jaki sposób implementacja nie jest poprawna? Wygląda trochę jak przykład podany [w dokumentacji] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx) (z adendum opisanym w sekcji komentarza). Po drugie, czy atrybut XmlRoot jest odpowiedni w tym przykładzie? Jakie to różnice? –
Jeśli chodzi o implementację, która nie zapewnia poprawnego XML, zapomniałem, że "framework zapisuje element opakowania i ustawia pisarza XML po jego uruchomieniu". Poprawię odpowiedź. Możesz faktycznie opuścić XmlRoot, jak można wywnioskować przez XmlSerializer, jednak, gdy nadpisuję domyślne zachowanie serializacji na klasie, zwykle robię to na wszystkich składnikach dla jasności. – JamieSee
Wcześniej przegłosowałem, ponieważ OP pyta, kogo utworzyć dostosowalny atrybut XML. NIE tworząc elementu XML. –