WCF传输数据应用技巧剖析

开发 开发工具
WCF传输数据的方法是一个比较简单的操作步骤,我们可以通过集合来实现这一方法。在这里就先为大家详细介绍一些相关操作。

WCF是建立在.Net Framework 2.0基础之上的,它的应用可以帮助开发人员带来很多功能。在这里我们将会为大家详细介绍一下有关WCF传输数据的相关方法,以此来方便大家理解这方面的应用。

最近的开发,一直被DataContract头疼,微软为了更好的通用性和代码无关性,将DataContract进行了一系列的优化,使作为DataContract的类在进行Serialize的时候会被序列化成非常通用的数据格式,可以在任何开发语言中调用。但是我们是仅仅使用C#进行客户端和服务器端的开发,而且客户端和服务器端交换的数据是同一个类型。

刚开始我的代码是这样写的:

 

using System;  
using System.Collections;  
using System.ServiceModel;  
using System.Runtime.Serialization;  
namespace JCDEV.WCF.Test1  
{  
[DataContract]  
public class Message  
{  
private DataCommandCollections list;  
[DataMember]  
public DataCommandCollections List  
{  
get { return list; }  
set { list = value; }  
}  
}  
[DataContract]  
public class DataCommandCollections : CollectionBase  
{  
[DataMember]  
public IList List  
{  
get  
{  
return base.InnerList;  
}  
}  
}  
[DataContract]  
public class DataCommand  
{   
//代码省略...  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

我的本意是传递Message类,类中包含一个DataCommand的数组,但是这样做的结果是,生成的客户端代码中DataCommandCollections被修正为了一个object[],而DataCommand未被序列化。我总结一下原因是:DataCommandCollections集成于CollectionBase,该类是一个Collection的基类,内部有一个ArrayList数组,该数组默认是实现IList接口的,内部数据是Object型,所以在序列化是就生成了Object[],而不管实际的内部数据是何类型。

到这里我分析,DataContract在客户端生成代码时是根据其内部参数的类型来决定的。因此数组必须显性设置为DataCommand的数组,否则都将无法生成正确的代码。

解决该问题的方法是使用List<T>来作为父类,该类通过泛型的方式指定其内部参数,下面是我改进的程序:

 

using System;  
using System.Collections;  
using System.ServiceModel;  
using System.Runtime.Serialization;  
using System.Collections.Generic;  
namespace JCDEV.WCF.Test1  
{  
[DataContract]  
public class Message  
{  
private DataCommandCollections list;  
[DataMember]  
public DataCommandCollections List  
{  
get { return list; }  
set { list = value; }  
}  
}  
[DataContract]  
public class DataCommandCollections :List<DataCommand> 
{  
//代码省略...   
}  
[DataContract]  
public class DataCommand  
{   
//代码省略...  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

程序改进后在生成客户端时出错,查了下原因是因为如果类实现了IEnumable接口时,.Net会默认将他作为一个Collections类来进行序列化,无需指定他为DataContract,如果需自定义,应该使用CollectionDataContract特性。将代码修改后就没有错误了。客户端正确的生成了一个DataCommand[]和DataCommand类。#t#

但是这样生成的客户端代码其实并没有什么用,因为客户端本来就可以直接调用Message类,后来一个偶然的机会,我发现了一个新的方法,就是在客户端添加服务引用时,选择高级,然后将重新使用引用的程序集中的类型勾选上,这样客户端就不会生成一个Message类,而是直接使用自己引用的Message类了。

 

这里也可以设置对于集合类型,在客户端解析后的生成方式,默认是生成一个数组。

这里要注意一点,当使用重引用选项后,DataContract将无法使用,出的错误是“类型未被标示为可序列化”,我是使用Serializable来代替的,这个原因是什么我还不清楚,如果有人知道,希望也告诉我一下,谢谢。

补充一下:“类型未被标示为可序列化”原因找到了,是我疏忽的错误,呵呵,原因是我有一个对Message类进行序列化的函数,程序时在这里提示的错误。DataContract是可以使用的。至于.Net如何对集合进行操作,我将稍候发布。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-23 09:34:15

WCF重载

2009-12-21 18:46:50

WCF传输大数据

2010-02-22 15:27:05

WCF数据契约

2010-02-24 15:42:03

WCF服务端安全

2010-02-22 11:25:50

WCF DateSet

2010-03-02 10:50:57

WCF元数据交换

2010-02-22 17:51:46

WCF传较大数据

2010-03-01 18:11:40

WCF数据契约变更

2010-02-22 16:19:25

WCF自托管

2010-03-01 13:06:49

WCF继承

2009-11-09 14:02:31

WCF传输数据

2010-01-25 17:43:13

Android资源

2009-12-21 14:49:27

2010-02-25 15:25:19

WCF通道

2010-02-25 09:50:30

WCF路由截获消息

2010-02-22 15:20:54

WCF WS-Disc

2010-02-22 17:21:02

WCF消息交换

2010-08-12 11:34:15

Flex数据绑定

2010-02-23 14:17:20

WCF配置文件

2009-12-21 18:10:50

WCF实现事件通知
点赞
收藏

51CTO技术栈公众号