закрытая инициализированная переменная не инициализируется - PullRequest
0 голосов
/ 18 января 2011

У меня есть контракт данных на унаследованный частичный класс, подобный этому:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;

namespace Domain
{
  [DataContract]
  public partial class IdCard : DomainObject<System.Int64>
  {
    private Group _grp;

    [DataMember]
    public virtual Group Grp
    {
        get { return _grp; }
        set { _grp = value; }
    }

    private bool _unproxized = true;
    public override object UnProxy()
    {
        if (this._unproxized)  // this prevents stackoverflow with cyclical references
        {
            this.Grp = (Group)this.Grp.UnProxy();
            this._unproxized = false;
        }

        return this;
    }
  }
}

По какой-то причине _unproxized никогда не устанавливается в true; Есть идеи почему?

Я знаю, что могу просто переключить логику, но мне любопытно, почему переменная-член не инициализируется.

Ответы [ 4 ]

4 голосов
/ 20 января 2011

Был ли десериализован экземпляр, на который вы смотрите? Во время стандартной десериализации DataContract конструкторы не вызываются и назначаются только члены DataMembers. Переменная, на которую вы смотрите, не помечена как DataMember.

Этот поток описывает реализацию поведения, которое вы видите, используя почти идентичный пример.

2 голосов
/ 06 ноября 2012

Это потому, что при десериализации DataContract serialiser использует тип отражения для создания полностью неинициализированных экземпляров объекта, к которому он затем применяет данные.Вот почему DataContract serialiser не требует конструктора без параметров.(Даже если вы добавите один, он не будет вызван).Если вы пометите поле _unproxied атрибутом [DataMember], оно будет истинным.

0 голосов
/ 18 января 2011

попробуйте назначить переменные в конструкторе следующим образом:

public IdCard()
{
    _unproxized = true;
}
0 голосов
/ 18 января 2011

Я подозреваю, что вы используете ссылки на веб-сервисы.В этом случае код (приватная переменная) никогда не попадает к клиенту.

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