18.5.使用IExternalizable接口自定义序列化

18.5.1. 问题
当通过RemoteObject 或DataService 发送强类型数据时我想进行自定义决定哪些属性将被发送过去。
18.5.2. 解决办法
使用ActionScript 3 API flash.utils.IExternalizable,它兼容java.io.IExternalizable API.
18.5.3. 讨论
通常使用可序列化类是在序列化中包含只读的属性。虽然在服务端可有多种方式完成此目的,但是在客户端就没有什么方法了。因此最好的办法就是在客户端和服务端都有效,你可以使你的类进行自定义双向序列化。

这种方法相对简单,在客户端ActionScript 类只要实现flash.utils.IExternalizable。这个API 需要两个方法, readExternal 和writeExternal , 分别取得flash.utils.IDataInput 和flash.utils.IDataOutput 数据流,在服务端是由实现java.io.Externalizable 接口的Java 类实现这两个方法, 它也有两个readExternal 和writeExternal ,分别取得java.io.ObjectInput 和java.io.ObjectOutput 数据流。

虽然IDataInput和IDataOutput类让你设计自己的协议,但对于基本的数据类型如byte, int, 和UTF-8-编码Strings,可以充分利用已实现的readObject 和writeObject 方法。作为这些使用AMF 3有效地进行序列化和反序列化ActionScript 对象。(记住AMF 3 有三大优点:你可以只发送对象引用以避免多余的序列化实例,保持对象关系和处理周期性引用。你可以只发送对象特性,这样当实例重复时类型描述只发送一次。你可以只发送重复的字符串引用以避免产生冗余信息.)你甚至可以在自定义序列化代码中完全省略属性名称,通过固定的顺序发送属性值。

注意
这个例子只关注于只读属性的序列化,不过自定义序列化还有很多其他方面的用途,比如省略属性,避免多余的序列化信息,或包含来自自定义名称空间的属性。

注意java 中的writeExternal 方法如何写:
public void writeExternal(ObjectOutput out) throws IOException
{
out.writeObject(id);
out.writeObject(name);
out.writeObject(description);
out.writeInt(price);
}

对应的客户端ActionScript 的readExternal 方法:
+展开
-ActionScript
public function readExternal(input:IDataInput):void
{
_id = input.readObject() as String;
name = input.readObject() as String;
description = input.readObject() as String;
price = input.readInt();
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(88)喜欢(0)flash/flex/fcs/AIR