【问题标题】:My class lost its methods during serialization我的类在序列化过程中丢失了它的方法
【发布时间】:2012-05-10 13:21:24
【问题描述】:

我的问题是什么

从 ASMX 服务返回的对象在 Silverlight 应用程序中使用。类有方法,但 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;
}

银光代码

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.dllsilverlight 程序集的引用添加到silverlight 应用程序项目

  • 在项目中添加一个 WebService 应用程序(DogService.asmx 注意 asmx 扩展名)

  • DogService 添加对 Silverlight Dog.dll 程序集的引用

  • 从其中的 WebMethod 中返回 hardcoded List&lt;Dog&gt;

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

  • 看着你的狗也不会叫 :(

【问题讨论】:

    标签: c# silverlight web-services class asmx


    【解决方案1】:

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

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

    【讨论】:

    • 这就是为什么我像 var labradors = e.Result as List&lt;Dogs&gt;; 一样将输出对象明确地转换为 Dog 并且令人惊讶的是拉布拉多犬是 null 。即使类的实例是从服务发送的,怎么会发生这种情况
    • 实例发送:见Basics: How Web Services Work
    • +1 链接。发布于 2008 年,并在 2011 年举办了很好的活动 :)
    • 您能否解释一下为什么从服务发送的 List 无法在 silverlight 应用程序中转换为 List。我收到错误ObservableCollection&lt;DogService.Dog&gt; 无法转换为ObservableCollection&lt;DogClassNameSpace.Dog&gt; 这是否意味着服务引用在添加引用的过程中为服务生成了 Dog 类?
    • 没错。这是一个完全不同且不相关的课程。
    【解决方案2】:

    您应该使用可移植类库定义所有通用类,http://msdn.microsoft.com/en-us/library/gg597391.aspx

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

    Web 服务定义 (WSDL) 只处理字段/属性。方法不会通过网络传输。

    【讨论】:

    • 您能否添加步骤来执行此操作you should ask the proxy generator to reuse those classes
    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多