`
mysh
  • 浏览: 28996 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

(BlazeDS 数据序列化问题)Flex 端通过 BlazeDS 框架与服务端的远程值对象交互

阅读更多
本文假设读者已了解 Flex 端如何通过 远程对象(RemoteObject)、以及 BlazeDS 框架调用 Java EE 服务器的远程方法,之前研究这东西花了不少时间,走了些弯路,这里写了些总结给需要的朋友。


JavaEE应用服务器(Tomcat) + BlazeDS(AMF实现框架) + Flex SDK(ActionScript 3)
参考(官方文档):http://livedocs.adobe.com/flex/3/html/help.html?content=data_access_4.html#201380



1、Java 对象 序列化到 Flex 客户端

客户端通过调用远程对象的方法,可以获取到远程数据,其中,一些 Java 对象将被自动转换为 AS 定义的对象,而自定义对象将按下面的方式转换:

Objects are serialized by using JavaBean introspection rules and also include public fields. Fields that are static, transient, or nonpublic, as well as bean properties that are nonpublic or static, are excluded.

Values found in public bean properties with get/set methods and public variables are sent to the client as properties on an 0bject. Private properties, constants, static properties, read-only properties, and so on are not serialized.
除已定义的类型外,标准的 JavaBean(get/set) 描述的数据成员、以及 对象的公有域 将被发送到远程 Flex 客户端(以下称序列化),成为一个对象(Object)。此外,静态域、瞬时域、非公有域,以及标准 JavaBean 的 非公有、静态域 将不会被序列化。

对于自定义类型,Flex 端得到的对象为 Object 类型,如果希望这个对象拥有强类型对象的功能(能进行逻辑处理,而不仅仅是传值),需要为与之对应的 AS 类注册一个别名,如 flash.net.registerClassAlias("zzx.javaserver.ro2.CustomObj2", Custom2),这样 Flex 端得到的 event.result 将为 Custom2 类型

如果集合容器和容器内的元素作为不同的属性一起被序列化到 Flex 端,那么对于该元素,Flex 虚拟机内只有一个实例:
public class Custom{
	public List<C> list = new ArrayList<C>();
	public C cObj = new C();;
	public Custom(){
		list.add(new C());
		list.add(cObj);
	}
}

Flex 端收到的对象中,cObj 和 list 中的一个元素对应同一个实例



2、Flex 客户端对象 序列化到 Java 服务端

除已定义的 AS 类型转换外,自定义 AS 对象将依据以下规定转换为 Java 对象:
  • AS 中 get/set 方法描述的数据成员 以及 公有数据成员 将被序列化(For ActionScript objects, public properties defined with the get/set accessors and public variables are sent to the server.)
  • AS 对象需加 [RemoteClass(alias="")] 元标签以声明映射到的服务端 Java 对象
  • AS 对象和映射的 Java 对象的属性需保持一致(The Java and ActionScript property names should match.)
  • 服务端对应的 JavaBean 对象必须有无参构造器
  • 调用的远程对象方法时,参数表不能用来区别不同的 Java 重载方法(AS 不允许重载)
  • 要序列化的 AS 对象需要将类型导入到运行环境,如使用 import,也可以使用强类型定义来保证(The ActionScript class to which data is converted must be used or referenced in the MXML file for it to be linked into the SWF file and available at run time. The class itself should use strongly typed references so that its dependencies are also linked.)
  • 元标签 [Transient] 可以保证属性不被序列化


从 Flex 端传递到 Java 端的 String 对象保持单例特性
假如 Flex 端某个实例有多个不同的引用,那么序列化到 Java 端时,这多个引用将指向同一个实例



1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics