Проблема с отправкой объекта через сервис wcf с приватными полями - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть класс Car

public class Car
{
    private Member _owner;

    public string OwnerName
    {
        get { return _owner.Name; }
    }

    public Car(Member owner)
    {
        _owner = owner;
    }
}

Я использую его как в приложении Silverlight, так и в сервисе wcf

Итак, в приложении я вызываю службу WCF, чтобы дать мне экземпляр класса автомобиля, но когда я получаю его в приложении, я вижу, что _owner - это empy.

Я знаю, что он пустой из-за приватности, но как я могу с этим справиться?

Я использую этот класс в своем приложении в качестве модели (MVVM), если это может помочь: /

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

С точки зрения сериализации WCF ваш класс Car действительно выглядит примерно так для службы WCF:

public class Car
{
    public string OwnerName { get; set; }
    //other public properties here....
}

Сериализатор WCF использует определение класса .NET в качестве шаблона для сериализации его содержимого в качестве простого объекта передачи данных. Когда служба WCF отправляет обратно экземпляр Car, только открытые свойства будут содержать значения. Сериализатор игнорирует все методы в классе. Кроме того, более поздние версии WCF не требуют разметки атрибута DataContract / DataMember.

Переменная _owner никогда не инициализируется, поскольку она не является частью открытых свойств класса Car. Вам нужно будет изменить структуру класса Car (возможно, добавив открытое свойство Owner типа Member), чтобы получить все данные, отправленные службой WCF вашему клиенту.

1 голос
/ 08 сентября 2011

Когда вы используете сериализатор контрактов данных по умолчанию со службами WCF, он сериализует и десериализует только открытые свойства класса.Также следует отметить, что при десериализации графа объекта конструктор не вызывается.У вас может быть публичное свойство с getter и setter.

Здесь - очень хорошая статья Джереми Ликнесса, объясняющая проблему, подобную вашейС точки зрения архитектуры, а также с точки зрения передового опыта при передаче объектов между уровнем обслуживания и клиентами можно использовать класс POCO, обычно называемый DTO (объект передачи данных).

1 голос
/ 08 сентября 2011

Для начала ни одно из ваших свойств не помечено как DataMembers.Класс не помечен как DataContract.Если это возвращается из службы WCF, я ожидаю увидеть:

[Serializable]
[DataContract]
public class Car
{
      private Member _owner;
      [DataMember]
      public string OwnerName
      {
          //getter
          //setter
       }

      etc..
}  

Должен ли участник быть приватным?Может ли оно быть преобразовано в свойство?

Имейте в виду, что для свойства [DataMember] требуется как набор, так и получение (так что WCF может считывать и извлекать данные из объекта).

http://msdn.microsoft.com/en-us/library/ms733127.aspx

...