我的班级在序列化期间丢失了它的方法

时间:2012-05-10 05:08:38

标签: c# silverlight web-services class asmx

我的问题是什么

从Silverlight应用程序中使用从ASMX服务返回的对象。 Class有方法,但ASMX WebMethod的结果不显示对象的方法。

告诉我更多

这是我的班级

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

这是WebMethod

[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扩展名)

  • Dog.dll

  • 添加对Silverlight DogService程序集的引用
  • 从其中的WebMethod返回hardcoded List<Dog>

  • 从Service添加引用到Silverlight应用程序,创建代理客户端实例并调用方法

  • 看着你的狗也不能吠叫:(

2 个答案:

答案 0 :(得分:5)

方法永远不会被序列化。只有数据。您的方法,事件,索引器,构造函数等将从不序列化。

无论如何,您不应该使用ASMX服务。请改用WCF。除其他外,WCF使您能够在客户端和服务之间共享数据类型。这将允许类似“序列化方法”的东西:在客户端和服务器上都可以使用相同的方法。

答案 1 :(得分:3)

您应该使用可移植类库http://msdn.microsoft.com/en-us/library/gg597391.aspx

定义所有公共类

然后在Silverlight中使用Web服务时,您应该要求代理生成器重用这些类。这确保您获得所有功能。

Web服务定义(WSDL)仅处理字段/属性。方法不通过电线传输。