IExternalizable

Posted 2009.03.12 16:58

IExternalizable 인터페이스를 통해 클래스가 데이터 스트림으로 인코딩되는 직렬화를 제어할 수 있습니다. 클래스에서 IExternalizable 인터페이스의 writeExternal()readExternal() 메서드를 구현하면 객체 및 객체의 상위 유형에 대한 데이터 스트림의 내용과 형식(클래스 이름 또는 유형 제외)을 사용자 정의할 수 있습니다. 각 클래스는 해당 인스턴스의 상태를 직렬화하고 재구성해야 합니다. 상태가 저장되려면 이러한 메서드가 상위 유형과 대칭을 이루어야 합니다. 이러한 메서드는 기본 AMF(Action Message Format) 직렬화 비헤이비어보다 우선합니다.

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();
      }
}



implements

클래스가 하나 이상의 인터페이스를 구현하도록 지정합니다. 클래스가 인터페이스를 구현할 때 클래스는 인터페이스에 선언된 모든 메서드를 정의해야 합니다. 인터페이스를 구현한 클래스의 모든 인스턴스는 인터페이스에 정의된 데이터 유형의 멤버로 간주됩니다. 결과적으로 is 연산자는 클래스 인스턴스가 첫 번째 피연산자이고 인터페이스가 두 번째 피연산자일 때 true를 반환하며, 인터페이스에 정의된 데이터 유형과의 강제 형 변환이 수행됩니다.
« PREV : 1 : ··· : 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : ··· : 41 : NEXT »