Как заставить XmlSerializer сериализовать элементы как атрибуты скомпилированного типа?
мы дали некоторый предопределенный XML, похожий на этот:
И моя цель состоит в том, чтобы десериализовать его вList
используяXmlSerializer
экземпляр и наоборот. Следовательно, я'мы определили тип как следующий:
[Serializable]
[XmlRoot("Root")]
public class RootClass
{
public List Points { get; set; }
/* and more properties */
}
Моя проблема в том, чтоXmlSerializer
интерпретирует свойства фреймворка какXmlElement
, Для этого они только читаются и пишутся как таковые, но не как требуемые атрибуты.
Одним из решений, о котором я думал, было определение пользовательского типа точки, который определяетXmlAttribtueAttribute
для каждого свойства координат. И эта пользовательская точка отображается наSystem.Windows.Point
состав. Это выглядело следующим образом:
[XmlIgnore]
public List Points { get; set; }
[XmlArray("Points")]
[XmlArrayItem("Point")]
public List CustomSerializedPoints
{
get { return this.Points.ToCustomSerializedPointList(); }
set { this.Points = value.ToPointList(); }
}
Но для этого решения ямы заметили, что сеттер никогда не вызывается, аXmlSerializer
вызывает добытчикCustomSerializedPoints
около пяти раз. Предполагается, что существует вспомогательный список, который содержит одну и ту же ссылку на каждый вызов и который никогда не является нулевым. Для этих требований это не решение для меня, потому что мне нужно было бы сохранитьList
в памяти только для записи точек, используя атрибуты вместо элементов.
Так есть ли у кого-нибудь более практичное решение?
Дополнительно мойXmlSerializer
код:
/* ... */
var serializer = new XmlSerializer(typeof(RootClass));
TextReader textReader = new StreamReader("file.xml");
(RootClass)serializer.Deserialize(textReader);
/* ... */