В моем последнем проекте я хочу отправлять пользовательские данные в виде объекта с помощью WCF. Причина этого в том, что мне не придется обновлять каждый клиент, когда вводится новый класс данных. Однако, когда я пытаюсь отправить эти данные, они никогда не поступают на сторону клиента.

Чтобы привести краткий пример: Пользовательский класс:

[DataContract]
public class MyData
     {
     [DataMember]
     public string Name { get ;set; }
     [DataMember]
     public id Value { get; set; }

     public MyData(string name, id value)
     {
     this.Name = name;
     this.Value = value;
     }
}

Когда я хочу отправить это клиенту, я использую:

object obj = new MyData("test",1);
service.SendDataToClient(obj);

Клиент никогда не получает это событие от службы, когда я отправляю его как объект. Однако, когда я отправляю его как MyData вместо объекта, он работает как надо. Как я могу отправить это как объект?

0
BramW 25 Мар 2011 в 17:49
ПРИМЕЧАНИЕ: свойство Value должно быть int вместо id
 – 
BramW
25 Мар 2011 в 17:51
Вам все равно не придется обновлять клиент, когда будет введен новый класс данных? Как еще клиент создаст новый объект для отправки?
 – 
Matt Davis
25 Мар 2011 в 18:25
Клиент отправляет полученные данные в UserControl, найденный в неизвестной сборке во время компиляции, поэтому клиенту не нужно знать пользовательский класс (поскольку UserControls ожидает массив объектов, которые они затем преобразуют в правильный тип)
 – 
BramW
25 Мар 2011 в 18:50

1 ответ

Если вы хотите отправить пользовательские данные, проще всего использовать XElement вместо объекта. Другой подход заключается в определении всех возможных передаваемых типов с помощью ServicKnownTypeAttribute или создании универсального преобразователя (в таком случае вы должны совместно использовать сборку контракта между клиентом и службой). Прочтите эту замечательную статью.

1
Ladislav Mrnka 25 Мар 2011 в 18:42
Вы не можете преобразовать пользовательский объект данных в XElement, не так ли? XElement используется в XML, я не хочу сериализовать свои данные в xml перед их отправкой. Например, можно отправить bool как объект, так почему я не могу отправить свои собственные классы как объект?
 – 
BramW
8 Апр 2011 в 18:09