Мой класс потерял свои методы во время сериализации

В чем моя проблема

Объект, возвращенный из службы ASMX, используется в приложении Silverlight. У класса есть методы, но в результате из ASMX WebMethod методы объекта не отображаются.

Расскажи мне больше

вот мой класс

public class Dog
{
      public string Name{get;set;}    
      public void Bark();
}

вот веб-метод

[WebMethod]
public List<Dog> Findlabrador()
{
    blah blah blah
    return list_of_labrador;
}

код Silverlight

void LabradorFetchCompleted(object sender, LabradorFetchCompletedEventArgs e)
{
  var list_of_labrador = e.Result;
  foreach(var labradorDog in list_of_labrador)
  {
      labradorDog.Bark();
      //** WTH my labrador can't BARK** Bark method is not shown in intellisense there is compilation error if i explicitly specify 
  }
}

Я программист, а не дилетант

Хорошо, хм, позвольте мне вставить ваши слова. Вот шаги для воспроизведения проблемы

  • Создайте проект приложения Silverlight (пусть VS создаст веб-сайт для размещения приложения)

  • Создайте библиотеку классов Silverlight и создайте в ней класс Dog

  • Скомпилировать библиотеку классов Silverlight для сборки (Dog.dll)

  • Добавить ссылку на Dog.dll сборка silverlight для проекта приложения silverlight

  • Добавьте приложение WebService в проект ( DogService.asmx обратите внимание на asmx расширение)

  • Добавить ссылку на Silverlight Dog.dll сборка для DogService

  • вернуть hardcoded List<Dog> класс из WebMethod внутри него

  • Добавьте ссылку из приложения Service в приложение Silverlight, создайте экземпляр прокси-клиента и вызовите метод

  • Смотрите, как ваш пёс тоже не может лаять:(

2 ответа

Решение

Методы никогда не сериализуются. Только данные. Ваши методы, события, индексаторы, конструкторы и т. Д. Никогда не будут сериализованы.

Вы не должны использовать сервисы ASMX в любом случае. Вместо этого используйте WCF. WCF, среди прочего, дает вам возможность обмениваться типами данных между клиентом и сервисом. Это позволило бы что-то вроде "методов сериализации": одни и те же методы могли использоваться как на клиенте, так и на сервере.

Вы должны определить все общие классы, используя переносимые библиотеки классов, http://msdn.microsoft.com/en-us/library/gg597391.aspx

А затем при использовании веб-службы в Silverlight вы должны попросить прокси-генератор повторно использовать эти классы. Это гарантирует, что вы получите все функции.

Определение веб-службы (WSDL) заботится только о полях / свойствах. Методы не передаются по проводам.

Другие вопросы по тегам