2016-01-27 2 views
0

По умолчанию XmlSerializer (автоматически предоставляется Visual Studio) используется с моей веб-службой. Я использую атрибуты только для меток [WebMethod] и объектов [Serialize()] и т. Д.C# XmlSerializer игнорировать элемент при десериализации

Объект, переданный в обоих направлениях между веб-службой и клиентом.

Один из членов (public MyClassType MyClass;) этого объекта предназначен для одностороннего, одноразового значения, отправленного клиенту. Если клиент возвращает этот набор элементов, я хочу, чтобы моя веб-служба не десериализовала его так, чтобы десериализованный объект содержал значение null для этого члена.

Проведено некоторое исследование, и если бы я использовал не XmlSerializer, тогда я мог бы прикрепить атрибут «OnDeserialization» к методу внутри объекта, который достиг бы того, что мне нужно.

Я пытаюсь избежать этого потенциального сценария. Веб-служба отправляет объект клиенту с помощью набора элементов. Клиент действует на члена, как должен. Клиент отправляет обратно объект с не очищенным членом (NULLed), потому что он забыл. Веб-служба выполняет некоторую дополнительную работу и отправляет один и тот же объект обратно (возможно, слегка изменен), но значение элемента не было изменено и, следовательно, перестало быть текущим, и клиент должен увидеть значение NULL для него, чтобы клиент не воздействовал на этот неизменный член снова. Веб-служба может установить новое значение для члена, на который клиент должен действовать снова.

Есть ли такой же простой способ сделать это для XmlSerializer?

+0

Вы хотите, чтобы член не был * десериализован * или не был установлен * после этого *? Легко предотвратить его установку, трудно предотвратить его десериализацию. – dbc

+0

Не быть десериализованным. Когда объект возвращается от клиента, член должен быть NULL в момент повторного использования объекта в коде веб-сервиса. – skubany

+0

Это означает, что он не установлен. Я хочу сказать, что легко удалить дескрипцию объекта MyClassType *, а затем отменить и никогда не возвращать *. – dbc

ответ

0

Я думаю, что вы ищете XmlIgnoreAttribute. https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlignoreattribute(v=vs.110).aspx

Или, возможно, суффикс «Указанный». http://www.distribucon.com/blog/IgnoringSpecifiedElementsDuringXMLSerialization.aspx

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Marusyk

+0

. Мне нужен атрибут XmlIgnoreAttribute, который применяется только при десериализации. В его нынешнем виде это применяется к сериализации. Я хочу, чтобы член был сериализован в веб-службе на выходе, и я не хочу, чтобы его десериализовали в веб-службе при возвращении. – skubany

0

Быстрый и грязный способ сделать это, чтобы прокси-объект на стороне серверного класса, который возвращает текущее значение MyClass, но отбрасывает текущее значение, когда набор:

[XmlIgnore] 
    public MyClassType MyClass { get; set; } 

    [XmlElement("MyClass")] 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public MyClassType GetMyClassForXml 
    { 
     get 
     { 
      return MyClass; 
     } 
     set 
     { 
      // DO NOTHING 
     } 
    } 

Затем отметьте «реальное» свойство [XmlIgnore].

Для более сложного решения см. Excluding some properties during serialization without changing the original class. Имейте в виду, что ответ, который использует XmlAttributeOverrides, является неполным, как сериализатор must be cached in a hash table to prevent a severe memory leak. Для примера такого хеширования, проверьте XMLSerialize and EXCLUDE the base class.

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