자바 7 의 기초-직렬 화 와 반 직렬 화

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/mazhimazh/article/details/20292331
자바 의 직렬 화 와 반 직렬 화 를 사용 하면 정보의 지속 적 인 저장 을 실현 하거나 자바 대상 의 깊 은 복 제 를 실현 할 수 있다.앞에서 설명 한 바 와 같이 서열 화 와 반 서열 화 를 사용 하여 대상 복 제 를 실현 하 는 것 은 다음 과 같다.
자바 의 기초-딥 클론 과 얕 은 클론(문장 참조: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)직렬 화 와 반 직렬 화 는 파일 의 지속 적 인 접근 을 실현 할 수 있 으 므 로 다른 지속 화,예 를 들 어 데이터 베이스 에 비해 어 떻 습 니까?

좋은 웹페이지 즐겨찾기