Java 서열화 연구 - 기본 개념

8090 단어 java 서열화
두 프로세스가 원격 통신을 할 때 서로 다양한 유형의 데이터를 보낼 수 있다.어떤 유형의 데이터든 이진 서열로 네트워크에 전송된다.송신자는 이 자바 대상을 바이트 시퀀스로 변환해야만 네트워크에서 전송할 수 있다.수신자는 바이트 서열을 다시 자바 대상으로 복원해야 한다.
Java 객체를 바이트 시퀀스로 변환하는 프로세스를 객체의 서열화라고 합니다.바이트 시퀀스를 Java 객체로 복원하는 프로세스를 객체의 반서열화라고 합니다.대상의 서열화는 주로 두 가지 용도가 있다. 1) 대상의 바이트 서열을 하드디스크에 영구적으로 저장하고 보통 한 파일에 저장한다.2) 네트워크에서 객체를 전송하는 바이트 시퀀스입니다.
1. JDK 라이브러리의 서열화 API java.io.Object OutputStream은 대상의 출력 흐름을 대표합니다. write Object (Object obj) 방법은 파라미터가 지정한 obj 대상을 서열화하여 얻은 바이트의 서열을 목표 출력 흐름에 쓸 수 있습니다.  java.io.ObjectInputStream은 대상의 입력 흐름을 대표합니다. 이 방법은readObject () 방법으로 원본 입력 흐름에서 바이트 서열을 읽고 그것을 반서열화하여 되돌려줍니다.Serializable 및 Externalizable 인터페이스를 구현한 클래스의 객체만 시리얼화할 수 있습니다.Externalizable 인터페이스는 Serializable 인터페이스를 계승하여 Externalizable 인터페이스의 클래스는 완전히 자체로 서열화된 행위를 제어하고, Serializable 인터페이스만 실현하는 클래스는 기본적인 서열화 방식을 사용할 수 있습니다.대상 서열화는 다음과 같은 절차를 포함한다. 1) 하나의 대상 출력 흐름을 만들고 다른 유형의 목표 출력 흐름, 예를 들어 파일 출력 흐름을 포장할 수 있다.2) 객체에서 스트림을 출력하는 writeObject() 방법으로 객체를 씁니다.대상의 반서열화 절차는 다음과 같다. 1) 대상 입력 흐름을 만들면 파일 입력 흐름과 같은 다른 유형의 원본 입력 흐름을 포장할 수 있다.2) 객체 입력 흐름에 대한 readObject() 방법으로 객체를 읽습니다.
예를 들어 logInfo 대상으로 서열화 인터페이스를 실현하는 것을 설명한다
import java.util.Date;



public class LoggingInfo implements java.io.Serializable 

{ 

    private Date loggingDate = new Date(); 

    private String uid; 

    private  String pwd; 

    

    LoggingInfo(String user, String password) 

    { 

        uid = user; 

        pwd = password; 

    } 

    public String toString() 

    { 

        String password=null; 

        if(pwd == null) 

        { 

        password = "not set"; 

        } 

        else 

        { 

            password = pwd; 

        } 

        return "logon info:  " + "user: " + uid +  " logging date : " + loggingDate.toString() + 

            " password: " + password; 

    } 

}

이 클래스를 호출할 때 정렬화와 반정렬화 작업을 진행합니다
public class testLog {



    public static void main(String[] args) {

        // TODO Auto-generated method stub

        LoggingInfo logInfo = new LoggingInfo("MIKE", " "); 

        System.out.println(logInfo.toString()); 

        try 

        { 

            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("logInfo.out"));

            o.writeObject(logInfo); 

            o.close(); 

        } 

        catch(Exception e) {}

        //To read the object back, we can write 

        try 

        { 

            ObjectInputStream in =new ObjectInputStream(new FileInputStream("logInfo.out")); 

            LoggingInfo logInfo1 = (LoggingInfo)in.readObject(); 

            System.out.println(logInfo1.toString()); 

        } 

        catch(Exception e) {//deal with exception}

    }

}

}

실행 후 결과 내보내기
logon info:  user: MIKE logging date : Thu Jan 10 23:03:14 CST 2013 password:  

logon info:  user: MIKE logging date : Thu Jan 10 23:03:14 CST 2013 password:  

동시에 디스크에 파일 logInfo.out.
2. Serializable 인터페이스 Object OutputStream을 실현하려면 Serializable 인터페이스의 클래스 대상만 서열화할 수 있습니다.기본적으로 Object OutputStream은 기본 방식에 따라 서열화됩니다. 이런 서열화 방식은 대상의 비transient의 실례 변수만 서열화하고 대상의transient의 실례 변수는 서열화하지 않으며 정적 변수도 서열화하지 않습니다.  
사용자가 클래스의 서열화 방식을 제어하기를 원한다면, 서열화 클래스에서 다음과 같은 형식의 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 () 방법을 가지고 있다면, 이 방법을 실행하고, 그렇지 않으면 기본 방식으로 서열화합니다.이 대상의 write Objectt () 방법에서 Object OutputStream의defaultWrite 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, 기본, 보호된 단계로 설정하면java를 던집니다.io.InvalidException: no valid constructor 예외입니다.4. 클래스를 시리얼화할 수 있는 다양한 버전의 시리얼화 호환성 - 시리얼라이제이션 인터페이스를 실현하는 클래스에는 시리얼화된 버전 식별자를 나타내는 정적 변수가 있습니다.
private static final long serialVersionUID;
위의 serialVersionUID 수치는 자바가 실행될 때 환경이 클래스의 내부 세부 사항에 따라 자동으로 생성됩니다.클래스의 소스 코드를 수정한 후 다시 컴파일하면 새로 생성된 클래스 파일의 SerialVersionUID 수치도 변경될 수 있습니다.클래스의 serialVersionUID의 기본값은 자바 컴파일러의 실현에 전적으로 의존한다. 같은 클래스에 대해 서로 다른 자바 컴파일러로 컴파일하면 서로 다른 serialVersionUID를 초래할 수도 있고 같을 수도 있다.읊다, 읊조리다serialVersionUID를 현저하게 정의하는 데는 두 가지 용도가 있다. 1) 특정한 상황에서 클래스의 서로 다른 버전이 서열화 호환되기를 원하기 때문에 클래스의 서로 다른 버전이 같은 serialVersionUID를 가지도록 확보해야 한다.2) 특정 상황에서 클래스의 다른 버전이 서열화 호환되는 것을 원하지 않기 때문에 클래스의 다른 버전이 서로 다른 serialVersionUID를 가지고 있는지 확인해야 한다.

좋은 웹페이지 즐겨찾기