最近的开发,一直被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{ //代码省略...}
}

我的本意是传递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{ //代码省略...}
}

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

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

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

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

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

转载于:https://www.cnblogs.com/jcdev/archive/2009/11/17/1604602.html

WCF学习笔记(二):在WCF中使用集合传输数据相关推荐

  1. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  2. Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码

    文章目录 1.argmax和max函数区别 2.axis=0/axis=1/axis=-1的区别 3.具体代码分析 ---3.1一维数组 ---3.2二维数组 ---3.3三维数组 1.argmax和 ...

  3. 微擎学习笔记二--模板视图中标签的if和ifp

    ifp 当前用户是否有 控制器--方法 的权限 包括add edit del send view等 方法必带 ifpp 当前用户是否有 插件 的权限 ife 当前用户是否有 控制器--方法 的权限 编 ...

  4. 数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一)

    数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一) 步骤: 1. 创建SILVERLIGHT应用程序 2. 创建LINQ TO SQL [注意序列化的问题 ...

  5. WCF学习笔记(2)——独立WCF服务

    本文将建立一个silverlight与wcf通讯的简单实例,wcf服务将被独立出来,而不再寄放在Web中.以下是详细步骤: 新建Silverlight应用程序,名称WCFtest,在解决方案上右键添加 ...

  6. css中怎么加入立体模型,CSS学习笔记二:css 画立体图形

    继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...

  7. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  8. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  9. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  10. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. android 防止连点的方法
  2. 为什么世界上一些最好的科学家和程序员,在世人眼里,都有点不太正常,甚至行为混乱...
  3. Linux VI编辑器
  4. 德式秘籍:产品总监最该学会的管理方法是什么?(一)
  5. VTK:直线网格之RectilinearGridToTetr​​ahedra
  6. webview与android java交互
  7. html数据复制到剪切板
  8. java 数组 equals_java中用equals比较两个内容相同的字符数组
  9. 国内外公共CDN静态资源网站大全
  10. 计算机 64位和32位区别,32位和64位的区别
  11. linux 网站获取数据失败,AnyBackup-Linux 环境下 Sybase 授权数据库实例时,提示错误:获取实例失败...
  12. Linux文件系统的目录结构详解
  13. HDU2109 Fighting for HDU【排序】
  14. AM调制解调matlab实验报告,MATLAB仿真AM调制解调 无线通信实验报告.doc
  15. 第十七届全国大学生智能车竞赛航天智慧物流获奖证书
  16. 预处理工艺采用水处理过滤器的作用说明
  17. USB Overdrive 注册码
  18. VASP计算弹性常数
  19. 第二章 java基础语言(三)
  20. 《图解TCP/IP》阅读笔记(第九章)—— 网络安全相关

热门文章

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
  2. Oracle根据日期区间查询Date类型的数据
  3. 2022-2028年中国金属薄膜行业市场深度监测及投资潜力研究报告
  4. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull
  5. 外网远程桌面连接设置
  6. NXP智能驾驶软件系统
  7. 目标检测中特征融合技术(YOLO v4)(下)
  8. 多目标跟踪:CVPR2019论文阅读
  9. [JAVA EE] 内联用法
  10. The specified child already has a parent. You must call removeView() on the