Я предполагал, что ни один из этих существующих членов класса не был украшен [XmlAttribute]. Уже программно применив украшения XmlIgnore, я подумал, что тот же подход будет работать для XmlAttribute: использовать класс XmlAttributeOverrides и определить XmlAttributeAttribute следующим образом (MyClass — это существующий/определенный класс, который я не могу изменить), а «my_record_id» — всего лишь один из много примеров полей в классе, которые я хочу десериализовать.
Обратите внимание, что код обязательно сокращено/усечено/выдержки для краткости и практичности.
Код: Выделить всё
// The XML (representative)
Код: Выделить всё
XmlAttributes wbAttributes = new XmlAttributes();
wbAttributes.XmlAttribute = new XmlAttributeAttribute("XmlAttribute");
XmlRootAttribute xroot = new XmlRootAttribute("MyClass");
XmlAttributeOverrides xOver = new XmlAttributeOverrides(); //used succesfully for XmlIgnore attribs
xOver.Add(typeof(MyClass), "my_record_id", wbAttributes);
Код: Выделить всё
static T DeserializeXML(string xml,XmlAttributeOverrides overrides, XmlRootAttribute root)
{
var serializer = new XmlSerializer(typeof(T), overrides,null,root,"");
return (T)serializer.Deserialize(XmlReader.Create(new StringReader(xml)));
}
Код: Выделить всё
// xmlString taken from file, that code omitted
MyClass c = DeserializeXML(xmlString, xOver,xroot);
Моя конечная цель – добиться того, чего я не могу сделать с существующим классом, а именно изменить прямо так:
Код: Выделить всё
public class MyClass
{
[XmlAttribute]
public int my_record_id;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... existing-c
Мобильная версия