Java 서열화 메커니즘과 원리의 깊이 있는 분석

7551 단어 java서열화
Java 정렬화 알고리즘 분석
Serialization(서열화)은 대상을 일련의 바이트로 묘사하는 과정이다.반서열화deserialization은 이 바이트를 하나의 대상으로 재구성하는 과정이다.Java 정렬화 API는 객체 정렬화를 처리하는 표준 메커니즘을 제공합니다.여기서 당신은 어떻게 대상을 서열화하는지, 언제 서열화하는지, 그리고 자바 서열화 알고리즘이 필요한지 배울 수 있습니다. 우리는 서열화된 후의 바이트가 어떻게 대상의 정보를 설명하는지 실례를 보여 줍니다.서열화의 필요성
Java에서 모든 것이 대상이고 분포식 환경에서 항상 Object를 이 쪽 네트워크나 장치에서 다른 쪽으로 전달해야 한다.양쪽에서 데이터를 전송할 수 있는 프로토콜이 필요합니다.Java 서열화 메커니즘은 바로 이 문제를 해결하기 위해 만들어진 것이다.어떻게 하나의 대상을 서열화합니까
하나의 대상이 서열화할 수 있는 전제는 Serializable 인터페이스를 실현하는 것이다. Serializable 인터페이스는 방법이 없고 표기와 같다.이 표시된 클래스가 있으면 서열화 메커니즘으로 처리됩니다.

import java.io.Serializable;      
class TestSerial implements Serializable {      
           public byte version = 100;    
           public byte count = 0;      
}

    然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。我们将Byte流暂时存储到temp.out文件里。

public static void main(String args[]) throws IOException {      
    FileOutputStream fos = new FileOutputStream("temp.out");      
    ObjectOutputStream oos = new ObjectOutputStream(fos);      
    TestSerial ts = new TestSerial();      
    oos.writeObject(ts);      
    oos.flush();      
    oos.close();      
}
Bytes 재구성 객체를 오래된 파일에서 읽으려면 Object InputStream을 사용할 수 있습니다..

public static void main(String args[]) throws      IOException {      
      FileInputStream fis = new FileInputStream("temp.out");      
      ObjectInputStream oin = new ObjectInputStream(fis);      
      TestSerial ts = (TestSerial) oin.readObject();      
       System.out.println("version="+ts.version);      
 }
실행 결과는
100. 대상의 서열화 형식
하나의 대상을 서열화한 후에는 어떤 모습입니까?방금 우리가 대상을 서열화하여 출력한temp를 엽니다.out 파일은 16진수로 표시됩니다.내용은 다음과 같습니다
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65

73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05

63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78

70 00 64

이 바이트는 서열화된 이후의 TestSerial 대상을 설명하는 데 사용되며, TestSerial 클래스에는 두 개의 영역만 있음을 알 수 있습니다.
    public byte version = 100;
    public byte count = 0;
그리고 모두byte형이다. 이론적으로 이 두 개의 영역을 저장하려면 2개의byte만 필요하지만 실제로temp.out가 차지하는 공간은 51bytes이다. 즉, 데이터 이외에 서열화 대상에 대한 다른 설명도 포함된다.Java의 정렬화 알고리즘
서열화 알고리즘은 일반적으로 절차에 따라 다음과 같은 일을 한다.
◆ 대상 실례와 관련된 클래스 데이터를 출력합니다.
◆ 클래스의 클래스 묘사가 더 이상 클래스가 없을 때까지 반복적으로 출력한다.
◆ 클래스 데이터가 끝나면 맨 윗부분의 초클래스부터 대상 실례의 실제 데이터 값을 출력한다.
◆ 위에서 아래로 출력된 실례의 데이터
우리는 발생할 수 있는 모든 상황을 더 완전하게 덮어쓰는 다른 예로 설명한다
    class parent implements Serializable {      
           int parentVersion = 10;      
    } 

    class contain implements Serializable{      
           int containVersion = 11;      
    } 

    public class SerialTest extends parent implements Serializable {      
           int version = 66;      
           contain con = new contain();                  
           public int getVersion() {      
                  return version;      
           }      
           public static void main(String args[]) throws IOException {      
                  FileOutputStream fos = new FileOutputStream("temp.out");      
                  ObjectOutputStream oos = new ObjectOutputStream(fos);      
                  SerialTest st = new SerialTest();      
                  oos.writeObject(st);      
                  oos.flush();      
                  oos.close();      
           }      
    }
이 예는 상당히 직설적이다.SerialTest 클래스는 Parent 클래스를 구현하고 내부에 하나의 Container 대상을 가지고 있습니다.
서열화된 형식은 다음과 같습니다.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
70 00 00 00 0B
이 바이트들이 무엇을 대표하는지 자세히 봅시다.시작 부분, 색상 보기:

  • AC ED: STREAM_MAGIC.성명은 서열화 프로토콜을 사용했다

  • 00 05: STREAM_VERSION.서열화 프로토콜 버전.

  • 0x73: TC_OBJECT.이것은 새로운 대상이라고 성명하다.  
  • 서열화 알고리즘의 첫 번째 단계는 출력 대상과 관련된 종류의 설명이다.예에서 보듯이 대상은 SerialTest 클래스의 실례이기 때문에 다음에 SerialTest 클래스의 설명을 출력합니다.색상:

  • 0x72: TC_CLASSDESC.여기서부터 새로운 클래스를 시작한다고 성명합니다.

  • 000A: 클래스 이름의 길이.

  • 53 65 72 69 61 6c 54 65 73 74: Serial Test, Class 클래스 이름..

  • 05 52 815A AC 66 02 F6: SerialVersionUID, 서열화 ID, 지정되지 않으면 알고리즘에 의해 임의로 8byte ID가 생성됩니다

  • 0x02: 기호.이 값은 이 대상이 서열화를 지원한다는 것을 나타냅니다

  • 00 02: 이 클래스에 포함된 도메인 개수..
  • 다음에 알고리즘은 그 중의 한 영역을 출력한다. intversion=66;색상:

  • 0x49: 도메인 유형입니다.49는 "I", 즉 Int

  • 0007: 도메인 이름의 길이입니다

  • 76 65 72 73 69 6F 6E: version, 도메인 이름 설명..
  • 그리고 알고리즘은 다음 필드를 출력합니다.containcon = newcontain ();이것은 좀 특수해서 대상이다.객체 유형 참조를 설명할 때 JVM의 표준 객체 서명 표현이 필요합니다. 색상:

  • 0x4C: 도메인의 유형입니다

  • 0003: 도메인 이름 길이

  • 63 6F 6E: 도메인 이름 설명, con

  • 0x74: TC_STRING.새로운 String을 대표합니다.String으로 객체 참조하기..

  • 00 09: 이 String 길이

  • 4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVM의 표준 객체 서명 표현입니다

  • 0x78: TC_ENDBLOCKDATA, 객체 블록 끝 플래그입니다
  • .다음 알고리즘은 슈퍼 클래스, 즉 Parent 클래스 설명을 출력합니다. 색을 보십시오.

  • 0x72: TC_CLASSDESC.이것은 새로운 종류라고 성명하다

  • 006: 클래스 길이

  • 70 61 72 65 6E 74: parent, 클래스 이름 설명..

  • 0E DB D2 BD 85 EE 63 7A: SerialVersionUID, 서열화 ID..

  • 0x02: 기호.이 값은 이 대상이 서열화를 지원한다는 것을 나타냅니다

  • 00 01: 클래스 중역의 개수.
  • 다음,parent류의 필드 설명을 출력합니다.intparentVersion=100;동일 색상:

  • 0x49: 도메인 유형입니다.49는 "I", 즉 Int

  • 000D: 도메인 이름 길이

  • 70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion, 도메인 이름 설명..

  • 0x78: TC_ENDBLOCKDATA, 객체 블록이 끝나는 플래그인..

  • 0x70: TC_NULL, 다른 클래스 초과 표시가 없음을 나타냅니다..
  • 지금까지 알고리즘은 모든 종류의 설명을 출력했다.다음 단계는 실례 대상의 실제 값을 출력하는 것이다.이때는 parent Class의 영역에서 시작됩니다. 색을 보십시오.

  • 000 000 00A: 10,parentVersion 도메인의 값입니다
  • 그리고 SerialTest 클래스의 도메인:

  • 00 00 42: 66,version 필드의 값.
  • 그리고 앞으로의bytes는 비교적 재미있습니다. 알고리즘은contain류의 정보를 묘사해야 합니다. 기억해야 합니다. 현재contain류에 대해 묘사한 적이 없습니다. 색을 보십시오.

  • 0x73: TC_OBJECT, 새로운 객체임을 선언합니다.

  • 0x72: TC_CLASSDESC는 여기서 새 클래스를 시작합니다

  • 007: 클래스 이름의 길이

  • 63 6F 6E 74 61 69 6E: contain, 클래스 설명..

  • FC BB E6 0E FB CB 60 C7: SerialVersionUID, 서열화 ID..

  • 0x02: Various flags.기호이 값은 이 대상이 서열화를 지원한다는 것을 나타냅니다

  • 00 01: 클래스 내의 도메인 개수..
  • .출력contain의 유일한 필드 설명, intcontainVersion=11;

  • 0x49: 도메인 유형입니다.49는 "I", 즉 Int..

  • 00 0E: 도메인 이름 길이

  • 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion, 도메인 이름 설명..

  • 0x78: TC_ENDBLOCKDATA 객체 블록이 끝나는 플래그.
  • 이때 서열화 알고리즘은contain에 초클래스가 있는지 확인하고 있으면 계속 출력합니다.

  • 0x70:TC_NULL, 클래스가 없어요..
  • 마지막으로,contain 클래스의 실제 필드 값을 출력합니다.

  • 00 00 00 0B: 11, containVersion 값
  • OK, 우리는 자바 서열화의 메커니즘과 원리를 토론했고 학우들에게 도움이 되었으면 합니다.

    좋은 웹페이지 즐겨찾기