Binary Format

바이너리 파일은 포맷 경계를 코드로 고정한다

바이트를 그대로 읽고 쓰는 순간, 파일을 해석하는 규칙도 코드가 책임집니다. 안전한 파일은 header, payload, 검증 정보를 분리합니다.

읽는 쪽이 먼저 확인할 파일 구조

Header
magicversionendianlength
Payload
record[0]record[1]...
Guard
checksumcount
padding구조체 멤버 사이 정렬 바이트 때문에 파일 크기가 기대와 달라질 수 있습니다.
대응: 필드별로 직접 쓰거나 packed 제약을 문서화
endianCPU나 플랫폼에 따라 정수 바이트 순서가 다를 수 있습니다.
대응: 표준 순서를 정하고 읽을 때 변환
pointer포인터 값은 실행 중 주소일 뿐이라 파일에 저장해도 다음 실행에서 의미가 없습니다.
대응: 실제 데이터나 길이+내용으로 직렬화
schema필드가 추가되면 예전 파일을 새 코드가 다르게 해석할 수 있습니다.
대응: version과 migration 규칙을 둠
누가 읽나같은 컴파일러와 같은 구조체만 읽는 임시 파일인지 확인합니다.
얼마나 보관하나장기 보관이면 버전과 호환성 정책을 먼저 둡니다.
어디서 읽나다른 OS와 CPU까지 고려하면 endian과 정렬을 고정합니다.
struct를 그대로 쓰는 것은 파일 형식 설계가 아니라 현재 메모리 배치를 복사하는 일입니다. 오래 쓸 파일일수록 포맷 경계를 명시해야 합니다.