J2SE 의 서열 화 된 계승

부모 클래스 가 Serializable 인 터 페 이 스 를 실현 하면 그의 하위 클래스 는 자동 으로 서열 화 될 것 이다.다음은 이 점 을 검증 했다.package Serial;  import java.io.Serializable; public class SuperC implements Serializable{/부모 클래스 가 직렬 화 int supervalue 를 실현 합 니 다.  public SuperC(int supervalue) {   this.supervalue = supervalue;   }   public String toString() {   return "supervalue: "+supervalue; }}public class SubC extends SuperC{/하위 클래스 int subvalue;  public SubC(int supervalue,int subvalue) {   super(supervalue);   this.subvalue=subvalue;   }   public String toString() {   return super.toString()+" sub: "+subvalue;   }   }   public class Test1 {   public static void main(String [] args){   SubC subc=new SubC(100,200);   FileInputStream in=null;   FileOutputStream out=null;   ObjectInputStream oin=null;   ObjectOutputStream oout=null;   try {    out = new FileOutputStream("Test1.txt");//하위 클래스 직렬 화 oout=new ObjectOutputStream(out);   oout.writeObject(subc);    oout.close();    oout=null;    in = new FileInputStream("Test1.txt");    oin = new ObjectInputStream(in);    SubC subc2=(SubC)oin.readObject();//하위 클래스 반 직렬 화 System.out.println(subc 2);  } catch (Exception ex){    ex.printStackTrace(); }finally{...여기 서 생략}}실행 결 과 는 다음 과 같 습 니 다:슈퍼 value:100 sub:200 하위 클래스 의 성공 적 인 직렬 화/반 직렬 화 를 볼 수 있 습 니 다.하위 클래스 가 서열 화 를 실현 하 는 것 은 매우 간단 한 일 로 보이 지만,때때로 우 리 는 부모 클래스 가 Serializable 인 터 페 이 스 를 실현 하지 못 하 게 한다.왜냐하면 때때로 부 류 는 추상 적 이 고(이것 은 관계 가 없다),그리고 부 류 는 모든 하위 클래스 가 서열 화 능력 을 가지 도록 강요 할 수 없 기 때문이다.다시 말 하면 부계 설계 의 목적 은 단지 계승 되 기 위 한 것 이다.Serializable 인 터 페 이 스 를 실현 하지 못 한 부모 클래스 를 위해 서열 화 할 수 있 는 하위 클래스 를 만 드 는 것 은 매우 번 거 로 운 일이 다.자바 docs 에 서 는 다음 과 같이 언급 했 습 니 다."직렬 화 되 지 않 는 클래스 의 하위 유형 을 직렬 화 할 수 있 도록 하기 위해,하위 유형 은 슈퍼 유형의 공개,보호 상태의 저장 및 복원 에 대한 책임 을 질 수 있 습 니 다.그리고(접근 가능 한 경우)패키지 필드 입 니 다.서브 타 입 은 클래스 가 확장 하 는 경우 에 만 클래스 의 상 태 를 초기 화하 기 위해 접근 가능 한 no-arg 생 성자 가 있다 고 가정 할 수 있 습 니 다.이 경우 가 아니라면 클래스 직렬 화 를 선언 하 는 오류 입 니 다.런 타임 에 오류 가 감 지 됩 니 다."즉,Serializable 인 터 페 이 스 를 실현 하지 못 한 부모 클래스 를 위해 서열 화 할 수 있 는 하위 클래스 를 만 들 려 면 두 가지 일 을 해 야 합 니 다.하 나 는 부모 클래스 에 참여 하지 않 은 constructor 가 있어 야 합 니 다.둘째,자 류 는 직렬 화(반 직렬 화)부류 의 도 메 인 을 책임 져 야 한다.우 리 는 SuperC 의 Serializable 인 터 페 이 스 를 제거 하고 SubC 에 Serializable 인 터 페 이 스 를 추가 합 니 다.실행 후 오류 가 발생 했 습 니 다:java.lang.Error:Unresolved compilation problem:Serializable cannot be resolved or is not a valid superinterface at Serial.SubC.(SubC.java:15)at Serial.Test1.main(Test1.java:19)Exception in thread"main"은 docs 에서 말 한 것 처럼 부모 클래스 에 구조 함수 가 없 으 면 안 됩 니 다.다음은 docs 의 건의 에 따라 이 예 를 바 꿉 니 다.Public abstract class SuperC{int supervalue;  public SuperC(int supervalue) {   this.supervalue = supervalue; }public SuperC(){}//참여 하지 않 은 constructor public String toString(){return"supervalue:"+supervalue;  }   }   public class SubC extends SuperC implements Serializable {   int subvalue;   public SubC(int supervalue,int subvalue) {    super(supervalue);    this.subvalue=subvalue;   }   public String toString() {    return super.toString()+" sub: "+subvalue;   }   private void writeObject(java.io.ObjectOutputStream out)   throws IOException{    out.defaultWriteObject();//우선 정렬 대상 out.writeInt(supervalue);/부모 클래스 의 도 메 인}private void readObject(java.io.Object InputStream in)throws IOException,ClassNotFoundException{in.defaultReadObject();/우선 역 직렬 화 대상 supervalue=in.readInt();/부모 클래스 의 도 메 인}을 역 정렬 하여 실행 한 결과 이 방법 이 정확 하 다 는 것 을 증명 하 였 습 니 다.여기 서 우 리 는 writeObject/readObject 방법 을 사 용 했 습 니 다.이 방법 이 존재 한다 면 직렬 화 될 때 호출 되 어 기본 적 인 행동 을 대체 할 것 입 니 다.우 리 는 직렬 화 할 때 먼저 Object OutputStream 의 default Write Object 를 호출 했 습 니 다.기본 적 인 직렬 화 행 위 를 사용 한 다음 에 부모 클래스 의 도 메 인 을 직렬 화 합 니 다.역 직렬 화 할 때 도 마찬가지다.요약:목적 행 위 는 Serializable 인 터 페 이 스 를 실현 하 는 부모 클래스 입 니 다.직렬 화 할 수 있 는 하위 클래스 를 작성 하여 Serializable 인 터 페 이 스 를 실현 하지 못 한 부모 클래스 로 자동 으로 직렬 화 합 니 다.직렬 화 할 수 있 는 하위 클래스 1 을 만 듭 니 다.부모 클래스 는 인삼 이 없 는 constructor 가 있어 야 합 니 다.2.자 류 는 먼저 자신 을 서열 화 한 다음 에 자 류 는 아버지 류 의 도 메 인 을 서열 화 해 야 한다.

좋은 웹페이지 즐겨찾기