새나물 기초편2012_8_26 서열화

3581 단어
이번 호의 새 요리는 서열화에 대해 이야기합시다. 매우 실용적인 기술적 포인트이고 조작도 매우 간단합니다.
1. 서열화 Serialize는 실질적으로'대상'을 특정한 규칙에 따라 특정한 바이트 흐름으로 봉인하는 것이다. 이런 바이트 흐름은 같은 규칙에 의해 해석된 후에 다른 위치에서 이 대상을 완전하게 생성한다. 즉, 반서열화 Deserialize이다.가장 많이 응용된 장면은 대상을 디스크에 저장하거나 네트워크 전송에 더 많이 저장할 수 있다.좀 더 간단하게 대상을 네가 인터넷에서 구입한 핸드폰으로 보고 상인이 너에게 포장을 한 후에 물류회사를 거쳐 다시 네 손에 운송한다. 너는 포장을 뜯어서 완전무결한 핸드폰을 얻을 수 있다.상인의 포장 과정을 서열화라고 하고, 네가 포장을 뜯는 것을 반서열화라고 하는데, 이렇게 간단하다.우리가 자주 접촉하는 것은 HSF 인터페이스를 호출한 후 되돌아오는 대상인데, 서열화를 하지 않으면 틀림없이 문제가 생길 것이다.
2. 실현도 간단하다. Serializeable 인터페이스만 실현하면 OK.
다음 예는 하나의 대상이 로컬 디스크에 저장되는 것을 설명하는데 이것은 서열화 과정이다.이 대상을 디스크에서 읽어내면 이것이 바로 반서열화이다.
먼저 로컬 디스크cat에 대상 p를 정렬합니다.txt에서 반서열화 출력하기;
package com.taobao.mm.august;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Cat implements Serializable {

	private static final long serialVersionUID = 4137418318779320231L;

	// 
    private String name;
    // 
    private int age;
	// 
   
    public Cat(String name,int age){
    	System.out.print(" !");
    	this.name = name;
    	this.age = age;
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public static void main(String[] args)  {
		ObjectOutputStream output = null;
		try{
			output = new ObjectOutputStream(new FileOutputStream("cat.txt"));
			Cat p = new Cat(" ",1);
			//    cat.txt
			output.writeObject(p);
			// 
			output.close();
		}catch (Exception e) {
			System.out.print(e);
		}
	}
}
이때Cat 대상 p를 로컬 디스크의cat에 저장합니다.txt에서cat.txt 파일은 우리가 이따가 다시 이야기하자. 먼저 반서열화된 코드를 보자.
역시리얼화된 코드:
package com.taobao.mm.august;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
/**
 *    cat.txt 
 */
public class GetCat {

	public static void main(String[] args) {
		ObjectInputStream input = null;
		try{
			input = new ObjectInputStream(new FileInputStream("cat.txt"));
			//readObject Object  
			Cat p =  (Cat) input.readObject();
			System.out.println(p.getName());//
			System.out.println(p.getAge());//
			// 
			input.close();
		}catch (Exception e) {
			System.out.print(e);
		}
	}
}
출력은 의심할 여지없이 혼돈과 1이다.
반서열화할 때 출력 구조기에서 '파라미터가 있는 구조 함수' 가 없습니다.이 말은 반서열화할 때 구조 함수를 호출하지 않았음을 나타낸다!
서열화에 관해서는 몇 가지 주의할 점이 있다.
1. 만약에 우리가 파일에 여러 개의 서열화된 대상을 출력했다면 반서열화할 때 이전 순서대로 읽어야 한다.
2. 만약에 하나의 서열화 클래스에 여러 개의 부류가 있다면 이 클래스의 모든 부류는 서열화될 수 있거나(Serializable 인터페이스를 실현했을 때) 또는 참조가 없는 구조 함수가 있을 수 있다.
3. 클래스의 초기화와 유사하다. 반서열화할 때 모든 부류를 초기화한다. 우선 반서열화 메커니즘을 사용하고 서열화할 수 없으면(Serializable 인터페이스가 실현되지 않음) 기본 구조 함수를 호출한다. 그렇지 않으면 버퍼링이 이상하다.
4. 하나의 대상이 서열화를 실현하려면 그 중의 인용 구성원도 서열화를 실현해야 한다. 예를 들어Cat에서 String name은 String 클래스의 정의를 보면 String이 Serializable 인터페이스를 실현한 것을 알 수 있다.
5. 어떤 대상이 여러 개의 다른 대상에 인용되었을 때, 예를 들어 클래스 B에서 A 대상 a를 인용했고, 클래스 C에서도 a를 인용했다. 그러면 세 개의 파일이 서열화될 때 모든 대상은 한 번만 실례화되고 여러 개의 a 대상이 나타나지 않는다!각 객체에 고유한 시리얼화된 번호가 지정되므로 반시리얼화할 때 먼저 객체가 반시리얼화되었는지 여부를 판단하고 인스턴스화된 경우 그 다음에 객체에 대한 반시리얼화를 수행하면 시리얼화된 번호만 지불됩니다.이것은 같은 대상이 여러 번 생성되지 않도록 보장한다.
6. 개체 A a여러 차례 서열화되었을 때 첫 번째 서열화만이 자바 대상 a를 바이트 서열로 전환시켜 출력할 수 있다. 뒤에 이 대상 a를 수정하더라도 바이트 서열을 다시 생성할 수 없다. 프로그램은 첫 번째 서열화 번호를 출력할 뿐이다.
7. private static final long serialVersionUID = 4137418318779320231L;이것은 익숙하죠. 버전 제어에 해당하는 표지입니다. 클래스가 반서열화될 때 로컬 클래스class 파일의 UID가 현재와 같은지 확인하십시오. 같으면 반서열화할 수 있습니다.
자, 여기까지 쓰시죠.
맞다,cat.txt는 아직 연구하지 않았습니다. 먼저 그림을 붙이고 다음에 다시 연구합시다.

좋은 웹페이지 즐겨찾기