2014-01-15 5 views
0

Я пытаюсь сериализовать объекты в xml. У меня есть установка доИзменение метода Атрибуты во время выполнения

public class Foo<t> 
{ 
    [XmlElement(ElementName ="test")] 
    public <t> bar { 
    get 
    { 
     var descriptor = TypeDescriptor.GetProperties(this.GetType())["bar"]; 

     var attrib =(XmlElementAttribute)descriptor.Attributes[typeof(XmlElementAttribute)]; 
     FieldInfo ElementName = attrib.GetType().GetProperty("ElementName") 
     ElementName.SetValue(attrib, "success"); 
    } 
    set{} 
} 

Я хочу изменить XmlElement.ElementName во время выполнения, но до сих пор были unsucessfull. В соответствии с this blog вы должны быть в состоянии сделать это. Также это SO post указывает, что я на правильном пути.

Мои вопросы Является ли то, что я хочу сделать возможным? Как мне это достичь?

EDIT: Я хочу, чтобы узел XML, чтобы называться «Успех» вместо «тест»

+1

'ElementName', вероятно, является свойством, а не полем, поэтому вместо этого попробуйте' GetProperty («ElementName»). – vcsjones

+0

Вы правы GetProperty привел к непустым. Но при сериализации я получил «Тест» вместо «Успех» – gh9

+0

Пожалуйста, обновите вопрос с новой ошибкой. – rae1

ответ

2

Техника в этой статье работает только для компонентов .NET, которые зависят от системы TypeDescriptor, которая абстракция более высокого уровня, чем исходное отражение. XmlSerializer не является одним из тех компонентов, насколько я знаю.

Ближе всего вы можете перейти на «изменение атрибутов во время выполнения» по отношению к XmlSerializer, используя XmlAttributeOverrides, но я забыл, как использовать это, потому что я использовал его так редко. Это позволяет вам изменять их для всего типа, но не отдельные экземпляры, которые вам кажутся нужными. Отчасти это связано с тем, что XmlSerializer на самом деле собирает делегат сериализации, который он использует снова и снова для сериализации вашего типа по причинам производительности.

Лучше всего использовать интерфейс IXmlSerializable, чтобы настроить сериализацию для данного класса. XmlSerializer будет соблюдать этот интерфейс, и это позволит вам иметь 100% контроль над XML, используя XmlReader/XmlWriter. Труднее вручную написать код сериализации, но у вас гораздо больше контроля. И вам нужно сделать это только для типов в вашем графике, которые требуют специальной обработки. Пример использования IXmlSerializable см. Мой ответ на Override XML Serialization Method.

+0

Да, XmlAttributeOverrides - это путь. См. [этот вопрос SO] (http://stackoverflow.com/questions/2247086/how-to-override-xml-element-name-for-collection-elements-using-xmlattributeoverr). –

+0

a ton больше работы, но спасибо !!!! – gh9

Смежные вопросы