包 | flash.utils |
接口 | public interface IExternalizable |
实现器 | ArrayCollection, ObjectProxy |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
writeExternal()
和 readExternal()
方法是由一个类实现的,以便允许为对象及其超类型自定义数据流的内容和格式(但不是类名或类型)。每个单独的类都必须序列化并重新构建其实例的状态。这些方法必须与超类型相称才能保存其状态。这些方法取代了本机的 Action Message Format (AMF) 序列化行为。
如果某个类既没有实现 IExternalizable 接口,也没有从实现该接口的类继承,则将仅使用公共成员的默认机制对该类的实例进行序列化。因此,类的私有成员、内部成员和受保护的成员将不可用。
若要序列化私有成员,类必须使用 IExternalizable 接口。例如,以下类将不会序列化其任何成员,因为这些成员都是私有成员:
class Example { private var one:int; private var two:int; }
但是,如果实现了 IExternalizable 接口,则可以将类的私有成员写入数据流或从数据流中读取类的私有成员,如下所示:
class Example implement IExternalizable { private var one:int; private var two:int; public function writeExternal(output:IDataOutput) { output.writeInt(one); output.writeInt(two); } public function readExternal(input:IDataInput) { one = input.readInt(); two = input.readInt(); } }
注意:如果某个类实现了 IExternalizable,则默认序列化不再适用于该类的实例。如果该类从超类继承公共成员,还必须小心地管理这些成员。
如果实现 IExternalizable 的某个类的子类有自己的私有成员,则该子类必须覆盖 IExternalizable 的方法,如下所示:
public class Base implements IExternalizable { private var one:Boolean; public function writeExternal(output:IDataOutput):void { output.writeBoolean(one); } public function readExternal(input:IDataInput):void { one = input.readBoolean(); } } public class Example extends Base { private var one:String; public override function writeExternal(output:IDataOutput):void { super.writeExternal(output); output.writeUTF(one); } public override function readExternal(input:IDataInput):void { super.readExternal(input); one = input.readUTF(); } }
在将数据写入数据流之前,也可以使用 IExternalizable 接口来压缩数据。例如:
class Example implements IExternalizable { public var one:Boolean; public var two:Boolean; public var three:Boolean; public var four:Boolean; public var five:Boolean; public var six:Boolean; public var seven:Boolean; public var eight:Boolean; public function writeExternal(output:IDataOutput) { var flag:int = 0; if (one) flag |= 1; if (two) flag |= 2; if (three) flag |= 4; if (four) flag |= 8; if (five) flag |= 16; if (six) flag |= 32; if (seven) flag |= 64; if (eight) flag |= 128; output.writeByte(flag); } public function readExternal(input:IDataInput) { var flag:int = input.readByte(); one = (flag & 1) != 0; two = (flag & 2) != 0; three = (flag & 4) != 0; four = (flag & 8) != 0; five = (flag & 16) != 0; six = (flag & 32) != 0; seven = (flag & 64) != 0; eight = (flag & 128) != 0; } }
另请参见
方法 | 定义方 | ||
---|---|---|---|
类实现此方法,以便通过调用 IDataInput 接口的方法,将其自身从数据流中解码。 | IExternalizable | ||
类实现此方法,以便通过调用 IDataOutput 接口的方法,将其自身编码到数据流中。 | IExternalizable |
readExternal | () | 方法 |
public function readExternal(input:IDataInput):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
类实现此方法,以便通过调用 IDataInput 接口的方法,将其自身从数据流中解码。此方法必须读取与 writeExternal()
方法所写入值处于同一序列中并且类型相同的值。
参数
input:IDataInput — 实现 IDataInput 接口的类的名称。 |
writeExternal | () | 方法 |
public function writeExternal(output:IDataOutput):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
类实现此方法,以便通过调用 IDataOutput 接口的方法,将其自身编码到数据流中。
参数
output:IDataOutput — 实现 IDataOutput 接口的类的名称。 |