자바 7 의 기초-직렬 화 와 반 직렬 화
자바 의 직렬 화 와 반 직렬 화 를 사용 하면 정보의 지속 적 인 저장 을 실현 하거나 자바 대상 의 깊 은 복 제 를 실현 할 수 있다.앞에서 설명 한 바 와 같이 서열 화 와 반 서열 화 를 사용 하여 대상 복 제 를 실현 하 는 것 은 다음 과 같다.
자바 의 기초-딥 클론 과 얕 은 클론(문장 참조:http://blog.csdn.net/mazhimazh/article/details/16828505)
다음은 서열 화 를 구체 적 으로 설명 하 겠 습 니 다.직렬 화 할 수 있 는 클래스 는 Serializable 인 터 페 이 스 를 실현 해 야 합 니 다.이 인터페이스의 정 의 는 다음 과 같 습 니 다.
4.567913.이 인 터 페 이 스 는 하나의 표지 로 만 사용 되 는데 이런 유형 이 직렬 화 와 반 직렬 화 를 할 수 있다 는 것 을 나타 낸다.전형 적 인 코드 는 다음 과 같다.
public interface Serializable { }
다음 클래스 를 직렬 화 와 반 직렬 화 할 때 직렬 화 인 터 페 이 스 를 계승 합 니 다.
class Shitt implements Serializable{ // Serializable }
클래스 의 직렬 화 와 반 직렬 화 작업 을 진행 합 니 다.
class Shitt implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
주의해 야 할 몇 가지 점:
(1)모든 직렬 화 할 클래스 에 private static final 의 serial Versionuid 를 추가 하면 특정한 대상 이 직렬 화 된 후에 도 해당 하 는 클래스 가 수정 되 더 라 도 이 대상 은 정확하게 반 직렬 화 될 수 있다.예 를 들 어:
최종 운행 결 과 는 다음 과 같다.
mazhi
현재 직렬 화 클래스 를 다음 과 같이 수정 합 니 다.
4.567913.현재 read()방법 으로 만 읽 기 작업 을 하면 정상적으로 읽 을 수 있 습 니 다.serialVersionUID 속성 을 제거 하거나 수정 후 오류 보고:
local class incopatible:직렬 화 인 터 페 이 스 를 실현 하 는 실 체 는 이전 버 전 을 호 환 할 수 있 습 니 다.이 변수 값 을 수정 하지 않 는 직렬 화 실 체 는 서로 직렬 화 되 고 반 직렬 화 될 수 있 습 니 다.
(2)한 클래스 에 인용 형식의 인 스 턴 스 변수 가 있다 면 이 인용 유형 도 Serializable 인 터 페 이 스 를 실현 해 야 합 니 다.그렇지 않 으 면 이상 을 던 질 것 이다.또는 실례 가 아 닌 Serializable 인터페이스 에서 이 인용 변수 에 transient 키 워드 를 추가 하면 됩 니 다.
먼저 인용 유형의 인 스 턴 스 변 수 를 어떻게 이해 하 는 지 설명 합 니 다.다음 과 같 습 니 다.
public static void save(Shitt t) { //
try {
FileOutputStream fs = new FileOutputStream("test.txt");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(t);
os.flush();
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void read() { //
try {
FileInputStream fs = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream(fs);
Shitt login = (Shitt) ois.readObject();
System.out.println(login.getName());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
4.567913.그러나 직렬 화 를 할 때 이 t 를 사용 하지 않 고 성명 만 하고 인 스 턴 스 를 하지 않 아 도 오류 가 발생 하지 않 습 니 다.실례 화 를 하려 면 인 터 페 이 스 를 실현 하거나 transient 키 워드 를 추가 해도 됩 니 다.그리고 직렬 화 를 하면 오류 가 발생 하지 않 습 니 다.다음 과 같 습 니 다.
public class MeTest{
public static void main(String[] args) {
Shitt t = new Shitt();
t.setName("mazhi");
MeTest.save(t);
MeTest.read();
}
// save() read()
}
변수 가 transient 에 의 해 수식 되면 변 수 는 더 이상 대상 의 지속 적 인 일부분 이 아니 라 이 변수 내용 은 직렬 화 된 후에 접근 할 수 없습니다.
(3)transient 키워드 에 의 해 수 식 된 변 수 는 더 이상 직렬 화 되 지 않 습 니 다.정적 변 수 는 transient 에 의 해 수식 되 든 안 되 든 직렬 화 되 지 않 습 니 다.
class Shitt implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int p;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getP() {
return p;
}
public void setP(int p) {
this.p = p;
}
}
이런 종류 에서 도대체 어떤 변수의 값 이 서열 화 될 수 있 고 어떤 것 이 안 될 수 있 습 니까?테스트 는 다음 과 같 습 니 다:
4
class Father{ } // Serializable
read()방법 에서 str 와 a 의 값 을 인쇄 합 니 다.최종 운행 결 과 는 다음 과 같다.
mazhi 0my name is mazhi 는 Father 류 가 직렬 화 인 터 페 이 스 를 실현 하지 못 했 음 을 알 수 있 습 니 다.그 정의 의 속성 은 직렬 화 될 수 없습니다.가장 주의해 야 할 것 은 정적 변수 입 니 다.이 변 수 는 직렬 화 되 지 않 습 니 다.그런데 왜 값 을 읽 을 수 있 습 니까?
클래스 로 딩 할 때 이 변 수 는 메모리 에 존재 하고 유일 하 게 유지 되 어 쓰레기 로 회수 되 지 않 기 때 문 입 니 다.다시 실행 할 때 정적 변 수 는 클래스 에 속 하기 때문에 당연히 이 값 을 꺼 낼 수 있 습 니 다.우 리 는 다른 가상 컴퓨터 에서 테스트 를 진행 할 수 있다 면 이 문제 가 발생 하지 않 을 것 이다.
동시에 이 예 에서 결론 도 얻 을 수 있다.
만약 에 하나의 클래스 가 Serializable 인 터 페 이 스 를 실 현 했 지만 부모 클래스 가 실현 되 지 않 았 다 면 이런 클래스 도 서열 화 할 수 있다.주의해 야 할 것 은 Object 초 류 가 이 직렬 화 된 인 터 페 이 스 를 실현 하지 못 했다 는 것 이다.왜 요?하나의 클래스 가 Serializable 인 터 페 이 스 를 실현 하지 못 했 지만,부모 클래스 가 실현 되 었 다 면,이 클래스 도 서열 화 할 수 있 기 때문이다.Object 가 직렬 화 인 터 페 이 스 를 실현 하 는 것 은 모든 유형 이 직렬 화 될 수 있다 는 개념 이 무의미 해 지고 현 재 는 여러 가지 문 제 를 일 으 킬 수 있다 는 것 을 의미한다.
(4)직렬 화 와 반 직렬 화 과정 에서 구조 함수 의 호출
4.567913.Shitt 류 를 직렬 화 하고 반 직렬 화 한 후의 운행 결 과 는 다음 과 같다.
부류 구조 방법 부류 구조 방법 부류 구조 방법 부류 구조 방법
부모 클래스 에 직렬 화 인 터 페 이 스 를 더 한 후 다시 직렬 화 와 반 직렬 화 작업 을 한 결 과 는 다음 과 같다.
부류 구조 방법
위 에서 결론 을 얻 을 수 있다.반 서열 화 를 진행 하 는 과정 에서 클래스 의 초기 화 규칙,즉 선친 클래스 의 하위 클래스 를 준수 하 는 것 이다.그러나 하위 클래스 의 초기 화 는 구조 함수 호출 등 수단 이 아니 라 지구 화 파일 에 저 장 된 정 보 를 초기 화 하 는 것 이다.
확장:
(1)사실은 클래스 의 직렬 화 과정 에서 속성 저장 형식 을 지정 할 수 있 습 니 다.예 를 들 어 XML,반 직렬 화 도 마찬가지 입 니 다.관심 이 있 으 면 다른 자 료 를 참조 할 수 있 습 니 다.
(2)직렬 화 와 반 직렬 화 는 파일 의 지속 적 인 접근 을 실현 할 수 있 으 므 로 다른 지속 화,예 를 들 어 데이터 베이스 에 비해 어 떻 습 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.