Java 직렬화 알고리즘 분석
직렬화는 객체를 일련의 바이트로 설명하는 프로세스이고, 역직렬화는 이러한 바이트를 객체로 재구성하는 프로세스입니다. Java 직렬화 API는 객체 직렬화를 처리하기 위한 표준 메커니즘을 제공합니다. 여기에서는 직렬화가 필요한 경우 객체를 직렬화하는 방법과 Java 직렬화 알고리즘을 학습하여 직렬화 후 바이트가 객체의 정보를 설명하는 방법을 보여줍니다.
직렬화의 필요성
Java에서는 모든 것이 객체입니다. 분산 환경에서는 한 네트워크나 장치에서 다른 네트워크나 장치로 객체를 전송해야 하는 경우가 많습니다. 이를 위해서는 양쪽 끝에서 데이터를 전송할 수 있는 프로토콜이 필요합니다. 이 문제를 해결하기 위해 Java 직렬화 메커니즘이 만들어졌습니다.
객체를 직렬화하는 방법
직렬화 가능한 객체의 전제 조건은 직렬화 가능 인터페이스를 구현하는 것입니다. 직렬화 가능 인터페이스에는 메서드가 없으며 마커와 비슷합니다. 이 태그가 있는 클래스는 직렬화 메커니즘으로 처리될 수 있습니다.
100.
객체의 직렬화 형식
직렬화된 후 객체는 어떤 모습일까요? 방금 객체를 직렬화하고 출력한 temp.out 파일을 열고 이를 16진수로 표시합니다. 내용은 다음과 같아야 합니다.
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
공개 바이트 버전 = 100;
공개 바이트 수 = 0;
둘 다 바이트 유형입니다. 이론상으로는 이 두 필드를 저장하는 데 2바이트만 필요하지만 실제로 temp.out은 51바이트를 차지합니다. 즉, 데이터 외에도 직렬화된 개체에 대한 다른 설명도 포함됩니다.
Java 직렬화 알고리즘
직렬화 알고리즘은 일반적으로 다음 단계를 수행합니다.
◆오브젝트 인스턴스와 관련된 클래스 메타데이터를 출력합니다.
◆더 이상 슈퍼클래스가 없을 때까지 해당 클래스의 슈퍼클래스 설명을 반복적으로 출력합니다.
◆클래스 메타데이터가 완성되면 최상위 슈퍼클래스부터 객체 인스턴스의 실제 데이터 값이 출력된다.
◆인스턴스 데이터를 위에서 아래로 반복적으로 출력
가능한 모든 상황을 보다 완벽하게 다루는 또 다른 예를 들어 보겠습니다.
클래스에는 직렬화 가능한 구현이 포함됩니다.{
int containVersion = 11;
}
공개 클래스 SerialTest는 상위 구현을 확장합니다. 직렬화 가능 {
정수 버전 = 66;
con = new 포함();
공개 int getVersion() {
반환 버전;
}
public static void main(String args[])에서 IOException이 발생합니다.
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
직렬화된 형식은 다음과 같습니다.
AC ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
이 바이트가 무엇을 나타내는지 자세히 살펴보겠습니다. 시작, 색상 참조:
직렬화 알고리즘의 첫 번째 단계는 객체와 관련된 클래스에 대한 설명을 출력하는 것입니다. 예제에 표시된 객체는 SerialTest 클래스의 인스턴스이므로 SerialTest 클래스에 대한 설명이 다음에 출력됩니다. 색상 보기:
다음으로 알고리즘은 inversion=66 필드 중 하나를 출력합니다. 색상을 참조하세요.
그런 다음 알고리즘은 다음 도메인인 contain con = new contain()을 출력합니다. 이것은 약간 특별하며 객체입니다. 객체 유형 참조를 설명할 때 JVM의 표준 객체 서명 표기법을 사용해야 합니다. 색상을 참조하세요.
.그런 다음 알고리즘은 상위 클래스인 상위 클래스에 대한 설명을 출력합니다. 색상을 참조하세요.
다음으로 상위 클래스 intparentVersion=100의 도메인 설명을 출력합니다.
지금까지 알고리즘은 모든 클래스에 대한 설명을 출력했습니다. 다음 단계는 인스턴스 개체의 실제 값을 출력하는 것입니다. 이때 상위 클래스의 도메인에서 시작됩니다. 색상을 참조하세요.
SerialTest 클래스의 필드도 있습니다:
다음 바이트는 더 흥미롭습니다. 알고리즘은 포함 클래스의 정보를 설명해야 합니다. 포함 클래스는 아직 설명되지 않았습니다.
.intcontainVersion=11 포함의 고유한 도메인 설명을 출력합니다.
이때 직렬화 알고리즘은 contain에 슈퍼클래스가 있는지 확인하고, 슈퍼클래스가 있으면 이를 출력합니다.
마지막으로 포함 클래스의 실제 도메인 값이 출력됩니다.
좋습니다. 지금까지 Java 직렬화의 메커니즘과 원리에 대해 논의했으며 이것이 학생들에게 도움이 되기를 바랍니다.