当应用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(简单数据类型) |
任何数值数据类型,包括Decimal、Double(双精度浮点型)、Integer和Long(长整型) |
|
boolean(简单数据类型) |
Boolean |
|
String(简单数据类型) |
String |
|
ActionScript(AS)对象 |
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 |
|
任何数值数据类型,包括Decimal、Double、Integer和Long |
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对象,并在一个服务方法中使用该对象:
|
应用服务器上的服务方法接收到该请求,参数是一个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方法。
| 回书目 上一节 下一节 |