Jak zmusić XmlSerializer do serializowania elementów jako atrybutów typu skompilowanego?

Podałem pewien predefiniowany XML podobny do tego:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Points>
      <Point X="1.345" Y="7.45" />
      <Point X="1.123" Y="5.564" />
      <Point X="3.34" Y="2.5345" />
   </Points>
   <!-- and a bunch of other attributes and structures which are perfectly serialized and deserialized by the XmlSerializer -->
</Root>

Moim celem jest przekształcenie go w postaćList<System.Windows.Point> używaćXmlSerializer przykład i odwrotnie. Dlatego zdefiniowałem typ w następujący sposób:

[Serializable]
[XmlRoot("Root")]
public class RootClass
{
   public List<System.Windows.Point> Points { get; set; }
   /* and more properties */
}

Moim problemem jest to, żeXmlSerializer interpretuje właściwości szkieletu jakoXmlElement. W tym celu są one tylko odczytywane i zapisywane jako takie, ale nie jako atrybuty zgodnie z wymaganiami.

Jedno rozwiązanie, o którym myślałem, to zdefiniowanie niestandardowego typu punktu, który definiujeXmlAttribtueAttribute dla każdej właściwości współrzędnych. Ten niestandardowy punkt zostanie odwzorowany naSystem.Windows.Point Struktura. Wyglądało to następująco:

[XmlIgnore]
public List<Point> Points { get; set; }

[XmlArray("Points")]
[XmlArrayItem("Point")]
public List<CustomSerializedPoint> CustomSerializedPoints
{
    get { return this.Points.ToCustomSerializedPointList(); }
    set { this.Points = value.ToPointList(); }
}

Ale dla tego rozwiązania zauważyłem, że seter nigdy nie jest wywoływany, aXmlSerializer nazywa getteraCustomSerializedPoints około pięć razy. Oczekuje, że istnieje lista kopii zapasowych, która ma to samo odwołanie dla każdego wywołania i która nigdy nie jest zerowa. Aby spełnić te wymagania, nie jest to rozwiązanie dla mnie, ponieważ musiałbym zachowaćList<CustomSerializedPoints> w pamięci tylko do pisania punktów za pomocą atrybutów zamiast elementów.

Czy więc ktoś ma bardziej praktyczne rozwiązanie?

Dodatkowo mójXmlSerializer kod:

/* ... */
var serializer = new XmlSerializer(typeof(RootClass));
TextReader textReader = new StreamReader("file.xml");
(RootClass)serializer.Deserialize(textReader);
/* ... */

questionAnswers(1)

yourAnswerToTheQuestion