자바 대상 의 직렬 화 와 반 직렬 화 응용 을 깊이 이해 하 다.

두 프로 세 스 가 원 격 통신 을 할 때 서로 다양한 종류의 데 이 터 를 보 낼 수 있다.어떤 유형의 데이터 든 이 진 시퀀스 로 네트워크 에 전송 된다.발송 자 는 이 자바 대상 을 바이트 시퀀스 로 변환 해 야 네트워크 에서 전송 할 수 있 습 니 다.수신 자 는 바이트 시퀀스 를 자바 대상 으로 복원 해 야 한다.자바 대상 을 바이트 시퀀스 로 바 꾸 는 과정 을 대상 의 직렬 화 라 고 합 니 다.바이트 시퀀스 를 자바 대상 으로 복원 하 는 과정 을 대상 의 역 직렬 화 라 고 합 니 다.대상 의 서열 화 는 주로 두 가지 용도 가 있다.1)대상 의 바이트 서열 을 하드디스크 에 영구적 으로 저장 하고 보통 한 파일 에 저장한다.2)네트워크 에서 전송 대상 의 바이트 시퀀스.1.JDK 라 이브 러 리 의 직렬 화 APIjava.io.ObjectOutputStream 은 대상 의 출력 흐름 을 대표 합 니 다.writeObject(Object obj)방법 은 매개 변수 가 지정 한 obj 대상 을 직렬 화하 여 얻 은 바이트 서열 을 대상 의 출력 흐름 에 쓸 수 있 습 니 다.java.io.Object InputStream 은 대상 의 입력 흐름 을 대표 합 니 다.readObject()방법 은 원본 입력 흐름 에서 바이트 시퀀스 를 읽 고 이 를 하나의 대상 으로 역 정렬 하여 되 돌려 줍 니 다.Serializable 과 Externalizable 인터페이스의 클래스 를 실현 해야만 서열 화 될 수 있다.Externalizable 인 터 페 이 스 는 Serializable 인 터 페 이 스 를 계승 하여 Externalizable 인 터 페 이 스 를 실현 하 는 클래스 는 완전히 자신 이 서열 화 하 는 행 위 를 제어 하고 Serializable 인터페이스 만 실현 하 는 클래스 는 기본 적 인 서열 화 방식 을 사용 할 수 있다.대상 직렬 화 는 다음 과 같은 절 차 를 포함한다.1)대상 출력 흐름 을 만 들 면 파일 출력 흐름 과 같은 다른 유형의 대상 출력 흐름 을 포장 할 수 있다.2)대상 을 통 해 출력 되 는 writeObject()방법 으로 대상 을 작성 합 니 다.대상 의 역 직렬 화 절 차 는 다음 과 같다.1)대상 입력 흐름 을 만 들 면 파일 입력 흐름 과 같은 다른 유형의 소스 입력 흐름 을 포장 할 수 있다.2)대상 입력 흐름 의 readObject()방법 으로 대상 을 읽 습 니 다.다음은 대응 하 는 예 를 살 펴 보 자.류 의 내용 은 다음 과 같다

import java.io.*;
import java.util.Date;

public class ObjectSaver {


public static void main(String[] args) throws Exception {
 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:""objectFile.obj"));

 //
 Customer customer = new Customer(" ", 24);
 out.writeObject(" !");
 out.writeObject(new Date());
 out.writeObject(customer);
 out.writeInt(123);
 out.close();

 //
 ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:""objectFile.obj"));
 System.out.println("obj1=" + (String) in.readObject());
 System.out.println("obj2=" + (Date) in.readObject());
 Customer obj3 = (Customer) in.readObject();
 System.out.println("obj3=" + obj3);
 int obj4 = in.readInt();
 System.out.println("obj4=" + obj4);
 in.close();
}
}

class Customer implements Serializable {
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}

public String toString() {
return "name=" + name + ", age=" + age;
}
}

출력 결 과 는 다음 과 같다2.Serializable 인터페이스 Object OutputStream 을 실현 하려 면 Serializable 인터페이스의 대상 만 직렬 화 할 수 있다.기본 적 인 상황 에서 Object OutputStream 은 기본 적 인 방식 으로 직렬 화 됩 니 다.이러한 직렬 화 방식 은 대상 의 비 transient 인 스 턴 스 변 수 를 직렬 화 할 뿐 대상 의 transient 인 스 턴 스 변 수 를 직렬 화 하지 않 고 정적 변 수 를 직렬 화 하지 않 습 니 다.Object OutputStream 이 기본 방식 으로 역 직렬 화 되 었 을 때 다음 과 같은 특징 이 있 습 니 다.1)메모리 에 있 는 대상 이 속 한 클래스 가 불 러 오지 않 으 면 이 종 류 를 먼저 불 러 오고 초기 화 합 니 다.classpath 에 해당 하 는 클래스 파일 이 존재 하지 않 으 면 ClassNotFoundException 을 던 집 니 다.2)반 서열 화 시 클래스 의 어떠한 구조 방법 도 사용 하지 않 는 다.사용자 가 제어 클래스 의 직렬 화 방식 을 원한 다 면 직렬 화 클래스 에서 다음 과 같은 형식의 writeObject()와 readObject()방법 을 제공 할 수 있 습 니 다

private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
Object OutputStream 이 Customer 대상 을 직렬 화 할 때 이 대상 이 writeObject()방법 이 있 으 면 이 방법 을 실행 합 니 다.그렇지 않 으 면 기본 방식 으로 직렬 화 됩 니 다.이 대상 의 writeObject()방법 에 서 는 Object OutputStream 의 default Write Object()방법 을 먼저 호출 하여 대상 의 출력 흐름 이 기본 직렬 화 작업 을 수행 하도록 할 수 있 습 니 다.같은 이치 로 역 직렬 화 된 상황 을 얻 을 수 있 지만 이번 에는 defaultReadObject()방법 입 니 다.어떤 대상 에는 민감 한 정보 가 포함 되 어 있 는데,이런 정 보 는 대외 적 으로 공개 해 서 는 안 된다.기본 방식 으로 직렬 화 되면 직렬 화 된 데이터 가 네트워크 에서 전 송 될 때 불법 분자 에 의 해 도 둑 맞 을 수 있다.이러한 정보 에 대해 암호 화 한 후에 직렬 화 할 수 있 고 반 직렬 화 할 때 복호화 하고 원래 의 정보 로 복원 해 야 한다.기본 직렬 화 방식 은 전체 대상 도 를 직렬 화 합 니 다.대상 도 를 재 귀적 으로 옮 겨 다 녀 야 합 니 다.대상 그림 이 복잡 하면 재 귀적 작업 은 많은 공간 과 시간 을 소모 하고 내부 데이터 구 조 는 양 방향 목록 이다.응용 할 때 일부 구성원 변 수 를 transient 형식 으로 바 꾸 면 공간 과 시간 을 절약 하고 직렬 화 된 성능 을 향상 시 킬 수 있 습 니 다.3.Externalizable 인 터 페 이 스 를 실현 합 니 다.Externalizable 인 터 페 이 스 는 Serializable 인터페이스 에서 계승 합 니 다.만약 에 하나의 클래스 가 Externalizable 인 터 페 이 스 를 실현 한다 면 이러한 종류의 직렬 화 행 위 를 완전히 제어 할 것 입 니 다.Externalizable 인 터 페 이 스 는 두 가지 방법 을 설명 했다

public void writeExternal(ObjectOutput out) throws IOException
public void readExternal(ObjectInput in) throws IOException , ClassNotFoundException
전 자 는 직렬 화 작업 을 맡 고 후 자 는 반 직렬 화 작업 을 책임 진다.Externalizable 인 터 페 이 스 를 실현 한 클래스 의 대상 을 반 서열 화 할 때 클래스 의 매개 변수 가 없 는 구조 방법 을 먼저 호출 합 니 다.이것 은 기본 적 인 반 서열 방식 과 다 릅 니 다.클래스 의 인자 가 없 는 구조 방법 을 삭제 하거나 이 구조 방법의 접근 권한 을 private,기본 또는 proctected 단계 로 설정 하면 자바.io.Invalid Exception:no valid constructor 이상 을 던 집 니 다.4.직렬 화 클래스 의 서로 다른 버 전의 직렬 화 호환성 은 Serializable 인 터 페 이 스 를 실현 하 는 클래스 는 모두 직렬 화 버 전 식별 자 를 나타 내 는 정적 변수 가 있 습 니 다

private static final long serialVersionUID;
이상 serialVersionuid 의 수 치 는 자바 가 실 행 될 때 환경 이 클래스 의 내부 디 테 일 에 따라 자동 으로 생 성 됩 니 다.클래스 의 소스 코드 를 수정 하고 다시 컴 파일 하면 새로 생 성 된 클래스 파일 의 serialVersionuid 의 수치 도 변 할 수 있 습 니 다.클래스 의 serialVersionUID 의 기본 값 은 자바 컴 파일 러 의 실현 에 전적으로 의존 합 니 다.같은 클래스 에 대해 서로 다른 자바 컴 파일 러 로 컴 파일 하면 서로 다른 serialVersionUID 를 초래 할 수도 있 고 같 을 수도 있 습 니 다.읊다,읊조리다serialVersionUID 를 명시 적 으로 정의 하 는 데 두 가지 용도 가 있 습 니 다.1)특정한 상황 에서 서로 다른 버 전이 직렬 화 호 환 되 기 를 원 하기 때문에 클래스 의 서로 다른 버 전이 같은 serialVersionUID 를 가지 고 있 는 지 확인 해 야 합 니 다.2)어떤 경우 에는 클래스 의 서로 다른 버 전이 직렬 화 호 환 되 는 것 을 원 하지 않 기 때문에 클래스 의 서로 다른 버 전이 서로 다른 serialVersionUID 를 가지 고 있 는 지 확인 해 야 한다.

좋은 웹페이지 즐겨찾기