센스있게 바이너리 저장하는 노하우 비법 공개점..ㅎ

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
최재혁
Posts: 53
Joined: 2009-02-15 23:18

센스있게 바이너리 저장하는 노하우 비법 공개점..ㅎ

Post by 최재혁 »

전 상당히 무식하게 바이너리를 저장하는데요

예를 들면 버텍스 쫘악~~~ fwrite저장하구

바로 저장하는 코드 fread로 바로 읽는 코드 작성해서 하고

하는 데요...

문제점이 사실 바이너리다 보니 한줄 한칸 이런거 틀리면 다 못읽게 되버리는데요..

혹시 센스있게 저장 로드 할수있는 방법이 있나요?
쩌는 프로그래머가 되고싶다.
비회원

Post by 비회원 »

Header 죠.
파일 타입.
버전.
데이터 사이즈
...

파일 타입은 이게 내가 읽으려는 그 포맷이 맞는 지 확인
버전은 저장 순서나 내용이 바뀐 경우 업그레이드,
쓰기는 항상 최신을 유지하고,
읽기는 버전 넘버 체크해서 하위 호환 유지하고,
데이터 사이즈 초반에 두어서 메모리 미리 확보하고,
기타.. 암호화나 압축방식을 초반에 저장하는 경우도 있고요..
미리 알아두면 좋은 정보들 헤더에 알차게 저장하는 거죠.
엉클뻐커
Posts: 194
Joined: 2001-10-22 09:00
Location: 30대후반 고졸 백수

계층적으로 구조화된 데이터를 바이너리로 저장할때 참고가 될 만한 것들

Post by 엉클뻐커 »

구글에서 만든 Protocol Buffers 라는것이 있습니다.

http://code.google.com/p/protobuf/

파일저장보다는 네트워크 전송쪽이 주 목적인듯 하지만

바이너리 직렬화를위한 C++ 코드를 생성해내는 툴입니다.

.proto 형식의 스크립트로 데이터의 레이아웃을 기술하면

이것을 읽고 쓰는 C++, Java, Python 코드를 만들어 줍니다.



live schema 라는 것도 있는데요
http://code.google.com/p/liveschema/

파일 저장이 주 목적이고 포맷 확장시의 하위호환성 지원 쪽이 겪고 있는 문제라면
이쪽이 더 맞을지도 모르겠습니다.


이건 xml 로 데이터 포맷을 기술하고 C++ 코드가 생성됩니다.

직렬화만 해주는게 아니라 일종의 CASE 도구 혹은 정적 객체 모델링용 메타 언어랄까.

공통 부모로부터 파생된 객체 계통구조를 만들다보면

매번 특정 패턴으로 반복되는 RTTI, 비교, 복사생성, 대입 등의 코드까지 생성해줍니다.

xml 파일 내부에 C++ 코드를 넣으면 자동생성되는 코드 사이에 유저가 작성한 함수를 끼워넣을 수도 있습니다.

게다가 직렬화 해야할 객체 멤버의 추가/삭제시 이전 버전으로 저장한 데이터의 컨버팅까지

어느정도 자동화 해주는군요.
최재혁
Posts: 53
Joined: 2009-02-15 23:18

Post by 최재혁 »

와우 빠르고 정확한 답변들 감사합니다
쩌는 프로그래머가 되고싶다.
yagur
Posts: 47
Joined: 2003-06-25 02:09
Location: Impression
Contact:

Protocol Buffers

Post by yagur »

BSD 라이센스라니... 멋지군요!!
비회원

Re: 계층적으로 구조화된 데이터를 바이너리로 저장할때 참고가 될 만한 것들

Post by 비회원 »

엉클뻐커 wrote:구글에서 만든 Protocol Buffers 라는것이 있습니다.

http://code.google.com/p/protobuf/

파일저장보다는 네트워크 전송쪽이 주 목적인듯 하지만

바이너리 직렬화를위한 C++ 코드를 생성해내는 툴입니다.

.proto 형식의 스크립트로 데이터의 레이아웃을 기술하면

이것을 읽고 쓰는 C++, Java, Python 코드를 만들어 줍니다.
.
protobuf 이건 파일에 쓰기밖에 안되는건가요?
xster
Posts: 214
Joined: 2006-10-30 10:56

Re: 계층적으로 구조화된 데이터를 바이너리로 저장할때 참고가 될 만한 것들

Post by xster »

비회원 wrote:protobuf 이건 파일에 쓰기밖에 안되는건가요?
ostream 과 istream 을 제대로 구현한다면 어떠한 객체도 모두 사용할 수 있을 것 같습니다.

첫 페이지 설명에는 파일 스트림을 사용했지만, 네트워크 스트림을 만든다면 통신에도 사용할 수 있겠네요.
ikpil
Posts: 98
Joined: 2008-11-12 21:17

Post by ikpil »

http://code.google.com/p/protobuf/

이것을 이용하여, 네트워크 패킷에 활용하려고 했는데, 다소 어렵습니다. 왜냐하면 내부적으로 값을 밀어 넣고 뺄때마다, 동적 메모리 할당을 하기 때문이기도 하지만, 패킷 아이디 부여와 데이터 붙이는 작업이 .. 캐스팅 하나만으로 끝나지 않기 때문입니다.

하지만 바이너리 파일을 만들고, 읽기에는 매우 적절해 보입니다. 왜냐하면 무척 간편하게 읽을 수 있기 때문입니다.


-
네트워크 패킷으로 손쉽게 쓸수 없을까 했는데, 아쉽네요.
Locked