2011-01-18 5 views
0

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

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 никогда не устанавливается истина; Любые идеи почему?

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

+0

Прошу прощения, но как вы пришли к выводу, что он не инициализируется? –

+0

Во-первых, я знаю, что логическое значение по умолчанию - false. Во-вторых, код внутри условного кода никогда не вызывается. В-третьих, когда я проверяю его с помощью отладчика во время условного, он является ложным. –

+0

"частная инициализированная переменная, не инициализирующаяся". Название вопроса - парадокс. – Amy

ответ

4

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

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

+0

Отлично! Спасибо. –

0

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

+0

Вы правы, однако, я говорю о переменной на стороне сервера. –

0

пытаются присвоить varibles в конструкторе вроде этого:

public IdCard() 
{ 
    _unproxized = true; 
} 
+0

Согласовано, это решение. Я не прошу разрешения, но я спрашиваю, почему он не инициализируется. –

2

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

+0

Хорошее объяснение, и это звучит рационально, есть ли у вас какие-либо ссылки на поддержку? Это звучит как ошибка для меня, о которой следует сообщить диспетчеру ошибок MS (connect.microsoft.com) –

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