자바 대상 의 직렬 화 와 반 직렬 화 응용 을 깊이 이해 하 다.
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 를 가지 고 있 는 지 확인 해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.