| 包 | 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 接口的类的名称。 |