您所在的位置: 首页>>读书频道>>设计开发>>.Net系列>>

17.2.3 Flash Remoting MX和数据类型

http://book.51cto.com  2007-04-23 16:58  张亚飞  电子工业出版社  我要评论(0)

当应用Flash Remoting MX技术,从Flash影片应用程序向应用服务器发送数据和应用服务器返回数据给Flash影片应用程序时,数据被进行了两次转换:

(1)在客户端的Flash影片应用程序中,在ActionScript数据类型和Action Message Format(AMF)两种数据类型之间转换:发送时从ActionScript数据类型转换成AMF格式;返回的数据从AMF数据格式转换成ActionScript数据类型;
(2)在服务器网关中,是在.NET语言(C#、Visual Basic)数据类型和Action Message Format(AMF)两种数据类型之间转换:向应用服务器发送时从AMF数据格式转换成.NET语言(C#、Visual Basic)数据类型;从应用服务器返回的数据从.NET语言(C#、Visual Basic)数据类型转换成AMF数据格式。

如图17-4所示显示了这两次数据类型的转换。

图17-4  Flash Remoting MX的两次数据类型转换

这两次数据类型转换使得Flash Remoting MX可以不依赖服务器系统的数据编码方法,从而可以非常有效地与各种应用服务器技术相结合,包括Microsoft.NET应用服务器技术。

Flash Remoting MX可以自动识别数据类型并进行相应的数据类型转换。大多数情况下,数据类型转换是非常直接简单的,你只需将ActionScript数据作为参数传递给应用服务器,然后在结果处理方法中处理返回的结果即可。但是也有少数的情况必须考虑数据类型转换,否则,程序会出现不可预知的后果。

下面我们来详细介绍一下.NET语言(Visual Basic)的数据类型和ActionScript数据类型之间转换的对应关系。

1.从ActionScript数据类型向.NET数据类型转换

表17-1列出了ActionScript数据类型和相应的应用程序服务器中支持的数据类型。

17-1  ActionScript数据类型和相应的VB.NET数据类型

ActionScript数据类型

VB.NET数据类型

Number(简单数据类型)

任何数值数据类型,包括DecimalDouble(双精度浮点型)、IntegerLong(长整型)

boolean(简单数据类型)

Boolean

String(简单数据类型)

String

ActionScriptAS)对象

FlashGateway.IO.ASObject

Object(作为参数被传递到远程服务方法的对象,该对象是由name/value形式构成的)

FlashGateway.IO.ASObject

null

Nothing

undefined

Nothing

Array(索引是连续的数值)

System.Collections.ArrayList

Associative Array(索引是名称标示)

System.Collections.Hashtable

Date

Date

XML

System.Xml.XmlDocument

RecordSet(不能发送)

无对应项

在从ActionScript数据类型向VB.NET数据类型转换时还要注意以下几个重要的问题:

(1)只要是可能,Flash Remoting MX都会把ActionScript Number转换成.NET数值数据类型。但是,如果数值不能转换成相应的应用服务器数据类型(例如,ActionScript数值超出了应用服务器数据类型一个整形数值类型的范围),Flash Remoting MX就会在服务器上抛出一个错误,因此在开发应用程序时要注意应用服务器数据类型的取值范围。

如表17-2所示列出了VB.NET数值数据类型的取值范围。

17-2  VB.NET数值数据类型的取值范围

Decimal

0 +/-79 228 162 514 264 337 593 543 950 335之间不带小数点的数;

0 +/-7.922 816 251 426 433 759 354 395 033 5 之间带 28 位小数的数;

最小非零数为+/-0.000 000 000 000 000 000 000 000 000 1 (+/-1E-28)

Double

(双精度浮点型)

负数取值范围为-1.797 693 134 862 31E+308 -4.940 656 458 412 47E-324

正值取值范围为 4.940 656 458 412 47E-324 1.797 693 134 862 31E+308

Integer

-2 147 483 648 2 147 483 647

Long(长整型)

-9 223 372 036 854 775 808 9 223 372 036 854 775 807

(2)Flash Remoting MX在处理复合数组(Associative Array)时与对待连续数组不同。有一些ActionScript数组包含了不连续的索引(例如,仅包含索引0,2和3 ,而不包含索引1的数组),有一些ActionScript数组既包含数字又包含字符串,这些数组称为复合数组。Flash Remoting MX在处理复合数组时会将索引值转换成键值,但是当数值作为键值时是字符串类型(例如,"0","1","2")。

2.从.NET数据类型向ActionScript数据类型转换

如表17-3所示列出了应用程序服务器数据类型和相应的ActionScript中支持的数据类型:

17-3  VB.NET数据类型和相应的ActionScript数据类型

VB.NET数据类型

ActionScript数据类型

Nothing

null

Boolean

Boolean

任何数值数据类型,包括DecimalDoubleIntegerLong

Number

Char String

String

Date

Date

System.Collections.ICollection

 

object[]

Array

System.Collections.Hashtable

 

System.Collections.IDictionary

Associative array

Sytem.Data.DataSet

RecordSet对象组成的复合数组

System.Data.DataTable

RecordSet

FlashGateway.IO.ASObject

 

System.Exception

Object

FlashGateway.IO.ASObject(定义了Type属性)

Typed Object

System.Xml.XmlDocument

XML

(1)在从应用程序服务器数据类型向ActionScript数据类型转换时的注意事项

①如果应用服务器上的字符串数据表示的是一个数字,那么,在ActionScript中,如果需要的话,Flash将会将该字符串自动转换成数字。
②如果使用setType方法为应用服务器上的flashgateway.io.ASObject对象定义对象类型,并且对象类型名与ActionScript内建的对象类名相同,Flash Remoting MX将会在ActionScript脚本中创建一个该类的实例。
③要返回大量且相互独立的数据给Flash影片应用程序,可以定义一个复杂的应用服务器变量来包含这些数据,例如,一个变量可以转换成一个ActionScript对象,也可以是数组或者复合数组,仅仅返回一个变量,但是在Flash影片应用程序中可以使用该变量中的多个元素。

(2)处理对象

当在远程服务方法调用中传递一个Flash对象时,对象的属性被传递给网关。在.NET环境中,FlashGateway.IO.ASObject类(它执行ICollection接口)的一个实例就相当于一个Flash对象。因此,你可以向任何接受Map或ICollection的方法传递Flash对象。

因为Flash Remoting MX仅仅是传输数据,在服务器上对象方法是不适用的,同样,对象的属性也必须是Flash Remoting MX能够处理的类型。例如,你不能在一个将传递给远程服务方法的对象中包含Flash RecordSet对象,因为Flash Remoting MX不能将RecordSet对象转换成服务器上的一种数据类型。

当从服务器返回一个对象给Flash时,Flash Remoting MX将对象数据属性信息作为Flash对象发送给Flash。在Flash中,你可以将该对象的属性转换成Flash数据类型的。

(3)处理ActionScript typed对象

如果你在ActionScript脚本中使用Object.RegisterClass方法注册一个对象的话,你就创建了一个typed对象。Typed对象在Flash影片应用程序中是非常有用的,它可以用来创建Flash对象的子类。

在对Flash Remoting服务方法的调用中,你可以使用typed对象。

在一个服务方法调用中使用typed对象的一个实例,在服务器端,Flashgateway.IO. ASObject对象代表参数,它包含了对象的type名。

例如,下面的ActionScript脚本创建了一个typed对象,并在一个服务方法中使用该对象:

//创建一个类(也就是类的构造器)
myClass = function()
{
this.Value1 = "Test1";
}
//注册类
Object.registerClass("testClass", myClass);
//将一个类的实例发送到远程应用服务器Flash Remoting网关
myService.myFunction(new testClass());

应用服务器上的服务方法接收到该请求,参数是一个type对象,在Java和ColdFusion中是flashgateway.io.ASObject,在 .NET环境中是FlashGateway.IO.ASObject。服务方法可以访问该类的type名:testClass(在Java和ColdFusion中使用对象的getType方法,在.NET环境中使用ASType属性)。

当服务方法创建了一个新的typed对象返回Flash Remoting MX时,在Java和ColdFusion中,它实际是创建了一个type flashgateway.io.ASObject对象;在.NET环境中,它实际是创建了一个type FlashGateway.IO.ASObject对象。服务方法使用对象的构造器(在.NET环境中使用ASType属性)为在ActionScript脚本中使用Object.registerClass方法指定的type设置类名。

当Flash客户端从服务方法中接收到typed对象时,Flash运行type的构造器,并粘附该对象所有的prototype方法。

【责任编辑:火凤凰 TEL:(010)68476606-8007】

回书目   上一节   下一节
重复数据删除技术
Sun以10亿美元并购开源数据库厂商MySQL
Oracle数据库开发之PL/SQL基础应用
Oracle数据库开发基础教程
2006年数据库频道热点关注
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有