Сегодня у меня возникла странная проблема, когда я пытался сериализовать объект. Объект был создан с помощью «Добавить ссылку на службу» из веб-службы (svcutil.exe).
Проблема заключалась в том, что указанное ниже свойство (agencyId) не сериализовалось с остальной частью объекта. В отчаянии я прокомментировал свойство под ним, потому что ему было присвоено «XMLIgnoreAttribute» ... после того, как я прокомментировал игнорируемое свойство, поле agencyId сериализовалось, как и ожидалось.
Может кто-нибудь объяснить мне, почему произошло такое поведение? Спасибо!!
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
public string agencyId
{
get {
return this.agencyIdField;
}
set {
this.agencyIdField = value;
this.RaisePropertyChanged("agencyId");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool agencyIdSpecified
{
get
{
return this.agencyIdFieldSpecified;
}
set
{
this.agencyIdFieldSpecified = value;
this.RaisePropertyChanged("agencyIdSpecified");
}
}
хех :) ошибки стерилизации ... классическая опечатка: D 'невозможно стерилизовать этот объект, может произойти разведение'





Цель XmlIgnoreAttribute - сообщить XmlSerializer, что вы не хотите сериализовать это свойство: все дело в этом. Итак, вы видите спроектированное поведение этого кода. Намного лучше спросить, почему разработчик класса решил украсить это свойство именно таким образом.
Я думаю, что странность в том, что agenecyId игнорировался, когда атрибут XmlIgnore находится в поле agencyIdSpecified.
Существует шаблон (для XmlSerializer), согласно которому свойство Foo также будет искать либо «bool FooSpecified», либо «bool ShouldSerializeFoo ()» - и, если найдено, сериализует Foo только в том случае, если этот другой член возвращает true. Итак, я предполагаю, что для agencyIdSpecified никогда не было установлено значение true? Если удалить этот элемент, он всегда будет сериализован (если вы не добавите [DefaultValue] или аналогичный).
Этот тип поведения используется для моделирования необязательных значений в случае, когда нам действительно нужно знать, было ли оно в исходных данных, т.е. имеет ли оно значение 0, потому что вызывающий абонент сообщил нам это число, или потому, что это просто значение по умолчанию.
Обратите внимание, что член «FooSpecified» обычно имеет [XmlIgnore], поэтому XmlSerializer знает, что его не следует рассматривать как данные для сериализации. В этом нет необходимости (или, по сути, законно) с "ShouldSerializeFoo ()", поскольку методы никогда не сериализуются.
Можете ли вы опубликовать полученное сообщение об ошибке? Кроме того, исключения, создаваемые .NET для ошибок стерилизации, иногда вводят в заблуждение, поскольку фактическая ошибка может быть скрыта в паре внутренних исключений.