如何用BlazeDS前后台数据交互

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

如何用BlazeDS前后台数据交互_第1张图片

先来看看技术点: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 width: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 }

如需源码请留言

你可能感兴趣的:(blazeds)