Нечетная проблема сериализации .Net - PullRequest
4 голосов
/ 16 октября 2008

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

Ответы [ 2 ]

5 голосов
/ 16 октября 2008

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

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

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

0 голосов
/ 16 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...