Нечетная проблема сериализации .Net

Сегодня у меня возникла странная проблема, когда я пытался сериализовать объект. Объект был создан с помощью «Добавить ссылку на службу» из веб-службы (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");
        }
    }

Можете ли вы опубликовать полученное сообщение об ошибке? Кроме того, исключения, создаваемые .NET для ошибок стерилизации, иногда вводят в заблуждение, поскольку фактическая ошибка может быть скрыта в паре внутренних исключений.

rjzii 16.10.2008 17:58

хех :) ошибки стерилизации ... классическая опечатка: D 'невозможно стерилизовать этот объект, может произойти разведение'

workmad3 16.10.2008 18:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
414
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Цель XmlIgnoreAttribute - сообщить XmlSerializer, что вы не хотите сериализовать это свойство: все дело в этом. Итак, вы видите спроектированное поведение этого кода. Намного лучше спросить, почему разработчик класса решил украсить это свойство именно таким образом.

Я думаю, что странность в том, что agenecyId игнорировался, когда атрибут XmlIgnore находится в поле agencyIdSpecified.

workmad3 16.10.2008 18:06
Ответ принят как подходящий

Существует шаблон (для XmlSerializer), согласно которому свойство Foo также будет искать либо «bool FooSpecified», либо «bool ShouldSerializeFoo ()» - и, если найдено, сериализует Foo только в том случае, если этот другой член возвращает true. Итак, я предполагаю, что для agencyIdSpecified никогда не было установлено значение true? Если удалить этот элемент, он всегда будет сериализован (если вы не добавите [DefaultValue] или аналогичный).

Этот тип поведения используется для моделирования необязательных значений в случае, когда нам действительно нужно знать, было ли оно в исходных данных, т.е. имеет ли оно значение 0, потому что вызывающий абонент сообщил нам это число, или потому, что это просто значение по умолчанию.

Обратите внимание, что член «FooSpecified» обычно имеет [XmlIgnore], поэтому XmlSerializer знает, что его не следует рассматривать как данные для сериализации. В этом нет необходимости (или, по сути, законно) с "ShouldSerializeFoo ()", поскольку методы никогда не сериализуются.

Другие вопросы по теме