Программное добавление объявления атрибута Xml к члену существующего класса C#.C#

Место общения программистов C#
Ответить
Anonymous
 Программное добавление объявления атрибута Xml к члену существующего класса C#.

Сообщение Anonymous »

Я пытаюсь десериализовать узел XML (из простого текстового файла) в экземпляр существующего класса C#, используя метод Deserialize XmlSerializer. При десериализации не удалось заполнить ни один из членов существующего класса.
Я предполагал, что ни один из этих существующих членов класса не был украшен [XmlAttribute]. Уже программно применив украшения XmlIgnore, я подумал, что тот же подход будет работать для XmlAttribute: использовать класс XmlAttributeOverrides и определить XmlAttributeAttribute следующим образом (MyClass — это существующий/определенный класс, который я не могу изменить), а «my_record_id» — всего лишь один из много примеров полей в классе, которые я хочу десериализовать.
Обратите внимание, что код обязательно сокращено/усечено/выдержки для краткости и практичности.

Код: Выделить всё

// The XML (representative)

Затем я создаю этот код для добавления XmlAttribute в поле my_record_id

Код: Выделить всё

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);
Это неудачная десериализация. Поле «my_record_id» (как показано в коде) в классе не заполняется при десериализации. Я предполагаю, что неправильно применяю [XmlAttribute], но я совсем не уверен, в чем я ошибаюсь. Возможно, я использую XmlAttributeOverrides совершенно неправильно для этой цели.
Моя конечная цель – добиться того, чего я не могу сделать с существующим классом, а именно изменить прямо так:

Код: Выделить всё

public class MyClass
{
[XmlAttribute]
public int my_record_id;

}
Я выполнил несколько поисков по этому типу проблем, но большинство решений предполагают возможность изменить фактическое определение класса, но в данных обстоятельствах это невозможно. «Внедрив» атрибуты XmlIgnore в другие ненужные поля, я подумал, что это будет просто; увы, реальность показала обратное. Надеюсь, я просто упустил из виду что-то сложное и очевидное.

Подробнее здесь: https://stackoverflow.com/questions/793 ... existing-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»