惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
V
V2EX
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
月光博客
月光博客
云风的 BLOG
云风的 BLOG

博客园 - spoony

Flex4 Skinning 4: 留言板示例 Flex4 Skinning 2: 皮肤协议 Flex4 Skinning 1: 自定义一个简单按钮的皮肤 Air应用程序访问本地数据库 [通篇转载]调程序的小女孩 Adobe ColdFusion Reports(5) Adobe ColdFusion Reports(4) Adobe ColdFusion Reports(3) Adobe ColdFusion Reports(2) Adobe ColdFusion Reports(1) Adobe ColdFusion Charts(3) Adobe ColdFusion Charts(2) Adobe ColdFusion Charts(1) Adobe ColdFusion读写Microsoft Office Excel数据(3) Adobe ColdFusion读写Microsoft Office Excel数据(2) Adobe ColdFusion读写Microsoft Office Excel数据(1) Flex与DotNET WebService交互(1) Ext JS Designer 1.0.5 发布 设置Flex Builder中FlashPlayer调试版本 - spoony - 博客园
Flex与DotNET WebService交互(2)
spoony · 2009-12-27 · via 博客园 - spoony

         上篇讲了很简单的示例,但是有好多问题值得我们去深究一下,首先看下面的代码:

 

代码

1 internal var employees:ArrayCollection;
2 internal function onList(event:ResultEvent):void
3 {
4     employees = new ArrayCollection();
5     employees = event.result as ArrayCollection;
6     this.dgEmployees.dataProvider = employees;
7 }

         里面有个event.result, 那么这个result到底是什么内容呢,我们需要在那一行加上断点,调试运行来看个究竟。打开Flex Builder中的Variables选项卡,可以看到如下的“大量有用信息”:

首先可以确定了event.resultmx.collections.ArrayCollection类型,里面的数据正是我们想要的,而且mx.collections.ArrayCollectionFlex中绑定数据很常用的类型。这个时候我们回过头来看一下上篇中生成的XML数据:

代码

    xmlns="http://tempuri.org/">
 4    <Employee>
 5           <Id>006</Id> 
 6           <Name>Aking</Name> 
 7    </Employee>
 8    <Employee>
 9           <Id>007</Id> 
10           <Name>spoony</Name> 
11    </Employee>
12  </ArrayOfEmployee>
13  

仔细对比可以发现,XML数据中的类名称(Employee)在传到Flex端的时候被丢掉了。其实Flex并不关心WebService返回结果被序列化成什么内容,它直接访问的是WebService本身。即使不能成功序列化,照样可以访问。为了验证,下面再做一个实验。

首先在原来的WebService中添加一个返回类型为数组的新的WebMethod

代码

 1 /// <summary>
 2 /// web method used to return array
 3 /// </summary>
 4 /// <returns></returns>
 5 [WebMethod]
 6 public Employee[] arrayEmployees()
 7  {
 8       Employee[] employees = new Employee[2];
 9       employees[0= new Employee("006""Aking");
10       // To test the one-record-returned result, comment the following line. 
11        employees[1= new Employee("007""spoony");
12       return employees;
13  }

运行,使用HTTP POST 协议测试,得到一个异常信息:System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Unable to cast object of type 'ArrayCollectionorObjectProxy.Employee[]' to type 'System.Collections.Generic.List`1[ArrayCollectionorObjectProxy.Employee]'.

呵呵,转换失败,其实从这个错误中还可以进行一个设想,那就是无论你的WebMethod返回类型是什么,都要转化成System.Collections.Generic.List再进行序列化。这个具体笔者并没有深究。

接下来继续如上篇所讲用Flex访问这个新创建的WebMethod, 结果是event.result里的内容和上篇中用返回类型为List<T>是一样的,数据自然能正常显示。如下图:

上面主要是使用了List泛型来获取数据,自然现在泛型也是面向对象开发中主要使用的东西,其实DotNET里面集合类还有很多:System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合;System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能;System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

DotNETFlex结合使用的时候需要看清楚这些不同返回类型的WebMethod到底在Flex端被转化成什么类型,然后再进行相应数据处理,就不会出现问题了。典型的例子是当数据只有一条记录时,很有可能会转化成mx.utils.OjbectProxy而非mx.collections.ArrayCollection.