자바 Serializable 의 이해 와 요약

5835 단어 자바C++csocketOS
IBM 의 글 http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html
주로 직렬 화 id 의 역할 (직렬 화 와 반 직렬 화, Fa ç ade 모드), 정적 변수의 직렬 화 (대상 속성 이 아 닌 클래스 속성 에 속 하 며 직렬 화 되 지 않 음), 부모 클래스 의 직렬 화 (Serializable 에서 계승 되 지 않 았 으 며 구조 함수 가 있어 야 하 며 기본 값 은 유형 초기 값 으로 부 여 됨) 와 Transient 키워드, 특수 속성 암호 화(writeObject 와 readObject), 직렬 화 된 저장 규칙 (같은 대상 저장 참조)
 
1. 서열 화 는 무엇 을 하 는 것 입 니까?
       쉽게 말 하면 메모리 에 저 장 된 여러 대상 의 상태 (즉, 인 스 턴 스 변수, 방법 이 아 닙 니 다)또한 저 장 된 대상 상 태 를 다시 읽 을 수 있 습 니 다. object states 를 다양한 방법 으로 저장 할 수 있 지만 자바 는 대상 상 태 를 자신 보다 잘 저장 해 야 하 는 메커니즘 을 제공 합 니 다. 그것 이 바로 직렬 화 입 니 다. 2. 어떤 상황 에서 직렬 화 를 해 야 합 니까?        a) 메모리 의 대상 상 태 를 파일 이나 데이터베이스 에 저장 하고 싶 을 때;    b) 인터넷 에서 대상 을 소켓 으로 전송 하고 싶 을 때;    c) RMI 를 통 해 대상 을 전송 하고 싶 을 때;3. 한 대상 에 대해 서열 화 를 실현 할 때 도대체 무슨 일이 일 어 났 습 니까?    직렬 화 되 지 않 기 전에 더미 (Heap) 에 저 장 된 대상 마다 해당 하 는 상태 (state), 즉 인 스 턴 스 변수 (intance ariable) 가 있 습 니 다. 예 를 들 어:
Foo  myFoo = new Foo();
myFoo .setWidth(37);
myFoo.setHeight(70);

   아래 코드 를 통 해 직렬 화 된 후 MyFoo 대상 의 width 와 Height 인 스 턴 스 변수의 값 (37, 70) 이 foo. ser 파일 에 저 장 됩 니 다. 그러면 나중에 파일 에서 읽 고 다시 쌓 아 올 린 대상 을 만 들 수 있 습 니 다.물론 저장 할 때 대상 의 인 스 턴 스 변 수 를 저장 하 는 값 뿐만 아니 라 JVM 은 원래 의 대상 을 복원 하기 위해 소량의 정 보 를 저장 해 야 합 니 다.
FileOutputStream fs = new FileOutputStream("foo.ser");   
ObjectOutputStream os = new ObjectOutputStream(fs);   
os.writeObject(myFoo);

4. 직렬 화 (파일 에 저장) 를 실현 하 는 절차   a)Make a FileOutputStream            
FileOutputStream fs = new FileOutputStream("foo.ser");  
 
   b)Make a ObjectOutputStream         
ObjectOutputStream os =  new ObjectOutputStream(fs);      
 
   c)write the object  
os.writeObject(myObject1);     
os.writeObject(myObject2);     
os.writeObject(myObject3);    
 
   d) close the ObjectOutputStream
os.close();     
 
5. 예 를 들 어 설명 한다.
import java.io.*;  
  
     
public class  Box implements Serializable     
{     
    private int width;     
    private int height;     
     
    public void setWidth(int width){     
        this.width  = width;     
    }     
    public void setHeight(int height){     
        this.height = height;     
    }     
     
    public static void main(String[] args){     
        Box myBox = new Box();     
        myBox.setWidth(50);     
        myBox.setHeight(30);     
     
        try{     
            FileOutputStream fs = new FileOutputStream("foo.ser");     
            ObjectOutputStream os =  new ObjectOutputStream(fs);     
            os.writeObject(myBox);     
            os.close();     
        }catch(Exception ex){     
            ex.printStackTrace();     
        }     
    }     
         
}    
 
6. 관련 주의사항    a) 서열 화 할 때 대상 의 상태 만 저장 하고 대상 의 방법 을 상관 하지 않 는 다.    b) 부모 클래스 가 직렬 화 를 실현 할 때 하위 클래스 는 자동 으로 직렬 화 를 실현 하고 직렬 화 인 터 페 이 스 를 명시 적 으로 실현 할 필요 가 없다.    c) 한 대상 의 인 스 턴 스 변 수 는 다른 대상 을 참조 하고 이 대상 을 직렬 화 할 때 도 인용 대상 을 직렬 화 합 니 다.    d) 모든 대상 이 서열 화 될 수 있 는 것 은 아니다. 왜 안 되 는 지 에 대해 서 는 여러 가지 이유 가 있다. 예 를 들 어:        1. 안전 상의 이유, 예 를 들 어 한 대상 이 private, Public 등 field 를 가지 고 전송 할 대상, 예 를 들 어 파일 을 쓰 거나 rmi 전송 을 하 는 것 이다.  등등, 직렬 화 전송 과정 에서 이 대상 의 private 등 도 메 인 은 보호 되 지 않 습 니 다.       2. 자원 배분 의 원인, 예 를 들 어 socket, thread 류 는 직렬 화 되 거나 전송 하거나 저장 할 수 있 으 면 그들 에 게 다시 자원 을 나 눌 수 없습니다.  어 울 려, 그리고 이렇게 실현 할 필요 도 없다.
 
자바 직렬 화 (Serializable)
직렬 화 체 제 는 대상 의 유형 정보 만 저장 하고 속성의 유형 정보 와 속성 값 은 방법 과 아무런 관계 가 없다. 당신 은 이런 유형 에 10000 개의 방법 을 추가 하 더 라 도 직렬 화 내용 은 아무것도 증가 하지 않 을 것 이다.
  간단하게 말 하면 서열 화 는 대상 흐름 을 처리 하 는 메커니즘 이다. 이른바 대상 흐름 이란 대상 의 내용 을 유동 화 하 는 것 이다. 흐름 의 개념 은 여기 서 더 말 할 필요 가 없다 (즉 I / O). 우 리 는 유동 화 된 대상 에 대해 읽 기와 쓰기 작업 을 할 수도 있 고 유동 화 된 대상 을 네트워크 사이 에 전송 할 수도 있다 (주: 대상 을 네트워크 에 전송 하려 면 반드시 유동 화 해 야 한다).! 대상 흐름 에 대해 읽 기와 쓰기 작업 을 할 때 문제 가 발생 할 수 있 습 니 다. 서열 화 체 제 는 바로 이런 문 제 를 해결 하 는 데 사 용 됩 니 다!
문제 의 인용:
위 에서 말 한 바 와 같이 읽 기와 쓰기 대상 에 게 무슨 문제 가 있 습 니까? 예 를 들 어 제 가 대상 을 디스크 파일 에 기록 한 후에 읽 으 려 면 어떤 문제 가 있 습 니까? 서 두 르 지 마 세 요. 그 중에서 가장 큰 문 제 는 대상 참조 입 니 다. 예 를 들 어 제 가 두 가지 유형 이 있다 면 각각 A 와 B, B 류 에 A 류 대상 을 가리 키 는 인용 이 포함 되 어 있 습 니 다. 지금 우 리 는 두 가지 사례 를 들 어 인 스 턴 스 를 진행 하고 있 습 니 다.{A = new A (); B b = new B ();}이 때 메모리 에 실제 적 으로 두 개의 공간 을 분 배 했 습 니 다. 하나의 저장 대상 a, 하나의 저장 대상 b. 그 다음 에 우 리 는 그것 을 디스크 의 한 파일 에 쓰 려 고 합 니 다. 파일 을 쓸 때 문제 가 발생 했 습 니 다. 대상 b 는 대상 a 에 대한 인용 을 포함 하기 때문에 시스템 은 자동 으로 a 의 데 이 터 를 b 로 복사 합 니 다. 그러면 우리 가 파일 에서 대상 을 복원 할 때시 (즉, 메모리 에 다시 불 러 올 때) 메모리 에 세 개의 공간 이 분배 되 었 습 니 다. 대상 a 는 동시에 메모리 에 두 개의 부분 이 존재 합 니 다. 결 과 를 생각해 보 세 요. 만약 에 제 가 대상 a 의 데 이 터 를 수정 하고 싶다 면 모든 복사 본 을 검색 하여 대상 데이터 의 일치 성 을 달성 해 야 하 는 것 이 아 닙 니 다. 이것 은 우리 가 원 하 는 것 이 아 닙 니 다!
다음 직렬 화 메커니즘 의 해결 방안:
1. 디스크 에 저 장 된 모든 대상 에 게 일련 번호 (1, 2, 3 등)
2. 대상 을 저장 하려 면 대상 이 저장 되 었 는 지 확인 합 니 다.
3. 이전에 저장 한 적 이 있다 면 '저 장 된 시리 얼 번호 x 가 있 는 대상 과 같 습 니 다' 라 는 표 시 를 기록 해 야 합 니 다. 그렇지 않 으 면 이 대상 을 저장 합 니 다.
이상 의 절차 직렬 화 체 제 를 통 해 대상 이 인용 한 문 제 를 해결 하 였 습 니 다!
서열 화 된 실현
직렬 화 되 어야 할 클래스 를 직렬 화 할 수 있 는 인터페이스 입 니 다. 이 인 터 페 이 스 는 실현 할 방법 이 없습니다. implements Serializable 은 대상 이 직렬 화 될 수 있다 는 것 을 표시 한 다음 출력 흐름 (예: FileOutput Stream) 을 사용 하여 Object Output Stream (대상 흐름) 대상 을 구성 합 니 다. 이 어 Object Output Stream 대상 의 writeObject (Object obj) 를 사용 합 니 다.방법 은 매개 변 수 를 obj 의 대상 으로 쓸 수 있 으 며, 복구 하려 면 입력 흐름 을 사용 합 니 다.

좋은 웹페이지 즐겨찾기