通过 WCF 服务序列化泛型类型

本文关键字:泛型类型 序列化 服务 WCF 通过 | 更新日期: 2023-09-27 18:33:27

我有一个C#类定义如下:

public class GenericItem<T>
{
  public List<T> Items { get; set; }
  public DateTime TimeStamp { get; set; }
} 

我正在我的服务器上创建此类的实例。然后,我尝试通过 WCF 服务通过网络传递它,如下所示:

[OperationContract]
public GenericItem<MyCustomType> GetResult()
{
  GenericItem<MyCustomType> result = BuildGenericItem();
  return result;
}

在这一点上,一切都编译得很好。当我在 Silverlight 应用程序中重新编译"更新服务引用"时,我收到类似于以下内容的编译时错误:

MyNamespace.GenericItemOfMyCustomType[extra chars] 不包含 'GetEnumerator' 的公共定义

我不知道为什么:

  1. 出现额外的字符。每次我更新服务引用时,似乎都会发生变化。
  2. 如何实际解决此问题。

我做错了什么?

通过 WCF 服务序列化泛型类型

Sleiman 是正确的,但可以使用本文中所述的有界泛型,您也许能够实现您想要的。这允许您在服务中创建泛型类型并公开它。但使用者不会将其视为通用类型,因为在服务操作中指定了类型。

不能定义依赖于泛型类型参数的 WCF 协定。泛型是特定于 .NET,使用它们将违反 WCF 的面向服务的性质。但是,数据协定可以将集合作为数据成员包含在内,因为 WCF 为集合提供了专用的封送处理规则。

正如 sleiman 所指出的,SOAP 不支持泛型。

WCF 和泛型 -> http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/79585667-6b97-4ce4-93fa-3a4dcc7a9b86

相关问题 -> WCF。服务泛型方法

您可以在客户端使用以下方法,而不是使用服务引用:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("");
var myChannelFactory = new ChannelFactory<IService>(myBinding, myEndpoint);
IService gks = myChannelFactory.CreateChannel();

适用于泛型。