내가 가진 문제는 모든 변수 (int 또는 복합 객체와 같은 기본 요소)가 이미 바이트 시퀀스로 표시되지 않습니까?
그렇습니다. 여기서 문제는 해당 바이트의 레이아웃입니다. 간단한 길이 int
는 2, 4 또는 8 비트 일 수 있습니다. 크거나 작은 엔디안 일 수 있습니다. 부호없는, 1의 보수로 서명되거나 심지어 부정과 같은 매우 이국적인 비트 코딩으로 서명 될 수 있습니다.
int
바이너리를 메모리에서 덤프하여 "직렬화"라고 부르는 경우 직렬화를 해제하려면 거의 전체 컴퓨터, 운영 체제 및 프로그램을 연결해야합니다. 또는 적어도 그들에 대한 정확한 설명.
그렇다면 직렬화가 그 토픽 인 이유는 무엇입니까? 변수를 직렬화하려면이 바이트를 메모리로 가져 와서 파일에 쓸 수 없습니까? 내가 놓친 복잡한 점은 무엇입니까?
간단한 객체의 직렬화는 일부 규칙에 따라 적어 둡니다. 이러한 규칙은 충분하고 항상 분명하지는 않습니다. 예를 들어 xs:integer
in XML은 10 진법으로 작성되었습니다. 기본 16이 아니라 기본 9가 아니라 10입니다. 숨겨진 가정이 아니라 실제 규칙입니다. 이러한 규칙은 직렬화를 직렬화로 만듭니다. 때문에, 거의, 메모리에 프로그램의 비트 레이아웃에 대한 아무런 규정이 없다 .
그것은 단지 빙산의 일각이었습니다. 가장 간단한 프리미티브 시퀀스 인 C를 예로 들어 봅시다 struct
. 당신은 그것을 생각할 수 있습니다
struct {
short width;
short height;
long count;
}
주어진 컴퓨터 + OS에 정의 된 메모리 레이아웃이 있습니까? 글쎄요. 현재 #pragma pack
설정에 따라 컴파일러가 필드를 채 웁니다. 32 비트 컴파일의 기본 설정에서 둘 다 shorts
4 바이트로 채워 지므로 struct
실제로 메모리에 4 바이트의 3 개 필드가 있습니다. 따라서 이제는 short
16 비트 길이 를 지정할 필요 가 없으며 1, 음수, 크거나 작은 엔디안을 보완하는 정수입니다. 또한 프로그램이 컴파일 된 구조 패킹 설정을 기록해야합니다.
그것은 일련의 규칙에 관한 것입니다. 규칙 세트를 만들고 고수하는 것입니다.
그런 다음 이러한 규칙을 확장하여 가변 길이 목록 또는 비선형 데이터와 같은 더 복잡한 구조를 수용하고 사람의 가독성, 버전 관리, 이전 버전과의 호환성 및 오류 수정 등과 같은 기능을 추가 int
할 수 있습니다. 당신이 그것을 확실하게 다시 읽을 수있게하고 싶을뿐입니다.