Мой класс потерял свои методы во время сериализации
В чем моя проблема
Объект, возвращенный из службы 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) заботится только о полях / свойствах. Методы не передаются по проводам.