Ссылка на закрытый член WCF в классе DataContract становится NULL - PullRequest
4 голосов
/ 02 апреля 2012

У меня особенная проблема в WCF на уровне веб-сервисов.

Когда я создаю экземпляр закрытого члена (_Wagon) моего класса (этот экземпляр не является нулевым) в WCF, через несколько секунд он становится нулевым.

Я пытался диагностировать проблему, но пока не дал результата.

Поэтому я обращаюсь к вам, люди, чтобы помочь мне решить эту проблему.

Спасибо.

Отсюда и мой код:

[DataContract]
public class RemoteWagon
{
    private readonly IWagon _Wagon;

    public RemoteWagon(IWagon Wagon)
    {
        _Wagon = Wagon; //_Wagon isn't null here
    }

    ~RemoteWagon()
    {
        Trace.WriteLine("Do nothing");
    }       

    [DataMember]
    public RemoteBreakpoint Breakpoint
    {
        set
        {
            if (value == null)
            {
                _Wagon.Breakpoint = null; //_Wagon member is NULL...
            }
            else
            {
                //... useless code in this context.
            }
        }
    }       
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Это произойдет, если ваш класс был сериализован и десериализован DataContractSerializer (например, при отправке данных между клиентом и сервером)

Некоторые ссылки: DataContractSerializer не вызывает мой конструктор?

Если это так, то одно из возможных решений, которое сработало для меня: https://stackoverflow.com/a/9419943/724944

Таким образом, быстрая проверка и исправление этой проблемы (я предполагаю, что вы хотите инициализировать поле самостоятельно, а не сериализовать его) состояла бы в создании метода:

[OnDeserializing]
private void OnDeserializing(StreamingContext c)
{
    _Wagon = initializeWagon();
}

однако, как вы, вероятно, заметили, вы не сможете пропустить Wagon во время десериализации - вам придется инициализировать его по-другому.

С другой стороны, если вы хотите сериализовать _Wagon, выставьте его как public [DataMember] свойство

1 голос
/ 02 апреля 2012

Кажется, что если вы хотите сериализовать _Wagon, вы должны пометить его как DataMember и отказаться от него только для чтения. Если вы не хотите, чтобы он сериализовался, покажите нам свой код для создания и заполнения этого объекта.

...