如何用BlazeDS前后台数据交互

续上一篇文章如何用BlazeDS更改图片 之后,本篇文章介绍了如何在后台构建数据,并传送到前台。一般来讲有两种方式:构造XML数据,传送到前台后,通过XMLSerializer反序列化到DataBox中;后台构建Java对象,通过BlazeDS传送到前台后,映射成TWaver Flex的数据对象,然后直接添加到DataBox中。这里只介绍后面这种RemoteObject的方式,XML的方式将在后续文章中介绍。

先来看看技术点:BlazeDS的序列化机制。Flex的类只要指定[RemoteClass(alias="common.CNode")],或者registerClassAlias(“common.CNode”, CNode),就可以将Java类映射成Flex类。public的变量,或者有get和set方法的变量都将自动映射。但有些类型的变量映射就会出问题,比如Point:java和flex的Point类型无法自动映射。因此,自己控制哪些变量序列化,如何序列化相当关键。更多资料请参考官方文档。

Serializing between ActionScript and Java
Explicitly mapping ActionScript and Java objects

下面介绍如何自定义序列化
1. 创建Java数据类,这里将TWaver Flex的Data、Element和Node分开创建了,以便复用。其他数据类型,比如Link,Group等,大家可以类似创建,可以自己实现试试,练练手。

 

 

1 public class CData implements Externalizable {
2 ...
3 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
4 this.setIcon((String)in.readObject());
5 this.setName((String)in.readObject());
6 this.setToolTip((String)in.readObject());
7 }
8
9 public void writeExternal(ObjectOutput out) throws IOException {
10 out.writeObject(this.getIcon());
11 out.writeObject(this.getName());
12 out.writeObject(this.getToolTip());
13 }
14 }
1 public class CElememt extends CData implements Externalizable {
2 ...
3 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
4 super.readExternal(in);
5 this.setLayerID(in.readObject());
6 }
7
8 public void writeExternal(ObjectOutput out) throws IOException {
9 super.writeExternal(out);
10 out.writeObject(this.getLayerID());
11 }
12 }
1 public class CNode extends CElememt implements Externalizable {
2 ...
3 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
4 super.readExternal(in);
5
6 this.setImage((String)in.readObject());
7 this.setX(in.readDouble());
8 this.setY(in.readDouble());
9 this.setWidth(in.readDouble());
10 this.setHeight(in.readDouble());
11 }
12
13 public void writeExternal(ObjectOutput out) throws IOException {
14 super.writeExternal(out);
15
16 out.writeObject(this.getImage());
17 out.writeDouble(this.getX());
18 out.writeDouble(this.getY());
19 out.writeDouble(this.getWidth());
20 out.writeDouble(this.getHeight());
21 }
22 }

2. 生成数据,很简单,一个循环模拟了一些数据

1 public static CNode[] getNodes(){
2 CNode[] result = new CNode[4];
3 for(int i=0; i<result.length; i++){
4 CNode node = new CNode();
5 node.setName("Node"+i);
6 node.setX(50*i);
7 node.setY(50*i);
8 node.setToolTip("toolTip"+i);
9 node.setIcon("group_icon");
10 node.setImage("group_image");
11 node.setLayerID("Layer"+i);
12 result[i] = node;
13 }
14 return result;
15 }

3. 创建Flex数据类,这里注意保持和Java序列化的顺序一致

 

1 public class CNode extends twaver.Node implements IExternalizable {
2 ...
3 public function readExternal(input:IDataInput):void {
4 //Data
5   super.icon = input.readObject() as String;
6 super.name = input.readObject() as String;
7 super.toolTip = input.readObject() as String;
8 //parent
9
10 //Element
11 super.layerID = input.readObject();
12
13 //Node
14 super.image = input.readObject() as String;
15 super.location = new Point(input.readDouble(), input.readDouble());
16 var Number = input.readDouble();
17 if(width >= 0){
18 super.width = width;
19 }
20 var height:Number = input.readDouble();
21 if(height >= 0){
22 super.height = height;
23 }
24 }
25
26 public function writeExternal(output:IDataOutput):void {
27 //Data
28 output.writeObject(super.icon);
29 output.writeObject(super.name);
30 output.writeObject(super.toolTip);
31 //parent
32
33 //Element
34 output.writeObject(super.layerID);
35
36 //Node
37 output.writeObject(super.image);
38 output.writeDouble(super.x);
39 output.writeDouble(super.y);
40 output.writeDouble(super.width);
41 output.writeDouble(super.height);
42 }
43 }

4. 加载数据,用上一篇文章封装好的方法一个调用就OK了,另外别忘了用registerClassAlias给Flex类指定别名

 

1 registerClassAlias("common.CNode", CNode);
2
3 private function loadDatas(event:MouseEvent):void {
4 RemoteObjectUtil.invoke("DataUtil", "getNodes", function(result:Object):void{
5 var nodes:Array = result as Array;
6 for each(var node:CNode in nodes){
7 box.add(node);
8 }
9 });
10 }

如需源码请留言

原文地址:https://www.cnblogs.com/twaver/p/2100705.html