flash.utils
接口public interface IExternalizable
实现器 ArrayCollection, ObjectProxy

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

将类编码到数据流中时,IExternalizable 接口提供对其序列化的控制。IExternalizable 接口的 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;
      }
 }

另请参见

flash.net.ObjectEncoding
Using RemoteObject components


公共方法
 方法定义方
  
类实现此方法,以便通过调用 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 接口的类的名称。