2011-01-11 3 views
0

나는 C++로 많은 구조체를 가지고있다. 파일에 저장하고 다시로드하고 싶습니다. 문제는 내 구조체의 일부가 기본 클래스 (/ structs)에 대한 포인터입니다. 그래서 형식을 알아 내고 그것을 만드는 방법이 필요합니다. 그들은 정말로 포드 (POD)입니다. 그들은 모두 공개 멤버와 생성자가 없습니다.C++ (semi) 파일 저장 /로드 반영? (해킹?)

파일에서 파일을 저장하고로드하는 가장 쉬운 방법은 무엇입니까? 구조체가 많이 있고 int, 포인터 또는 C 문자열을 사용하는 유일한 형식입니다. 내가 매크로 해킹을 할 수 있다고 생각하고있다. 그러나 실제로 나는 내가 무엇을해야하는지 전혀 모른다.

답변

2

여기에 자신을 굴복시키지 마십시오. 잘 발달되고 테스트 된 것을 사용하십시오. 하나 개의 아이디어

+0

내가 작성한 코드의 작은 줄에서 생성 된 코드가 많이 있습니다. –

+1

@ acidzombie24 : 그게 전부입니다 :-) 누군가가 이미 당신을 위해서 일했던 것입니다. –

0

포인터 Protocol Buffers이 특정 문제를 제기입니다 : ... 내가 직렬화 복원시 다시 작성해야하는 여러 구조체가 실제로 같은 포인터를 참조 할 수 있고 단일 포인터를하고자한다고 가정

첫 번째에게

: 아이디어, 보일러 플레이트 코드를 방지하기 위해, 컴파일시 감상의 도구를 만드는 것입니다

이 두 매크로는 struct에 대해 사악한 정보를 생성하므로 컴파일 시간과 런타임 사이의 차이를 메워주는 Fusion 알고리즘과 함께 사용할 수 있습니다.

이제 데이터를 직렬화하고 비 직렬화 할 수있는 것이 필요합니다. 직렬화 해제는 대개 조금 더 어렵습니다. 여기에서는 다형성이 없기 때문에 (항상 어려운 일을 만듭니다) 여기에 있습니다.

일반적으로 첫 번째 패스에서는 직렬화 할 개체의 그래프를 식별하고 모든 ID를 할당하며 직렬화 할 때 포인터 대신이 ID를 사용합니다. -> (할당 된 객체에 대한 포인터를 설정할 수 없습니다 포인터의 목록)

  • 는 ID의지도를 작성, 모든 개체를 할당

    • 지도가 ID입니다 : 역 직렬화를 들어, 3 열 맵을 사용 매번 할당 된 객체에 대한 포인터
    • ID를 deserialize 할 필요가있는 경우지도에서 찾아 볼 때 해당 포인터에 포인터를 올려 놓습니다.
    • 포인터를 할당 된 객체에 놓으면 지도에서 '설정되지 않은'포인터를 모두 채우십시오 (동시에 목록을 제거하십시오)

    물론 프레임 워크에서 처리하는 것이 좋습니다. s11n을 시도해 볼 수 있습니다. 올바르게 기억한다면 참조주기를 처리합니다.

  • +0

    이 부스트 매크로는 코드가 너무 추하고 외계인이되게합니다. IMO, 리플렉션을위한 최선의 방법은 코드 생성입니다. –

    +0

    @Maxim : 그렇다면 우리는 동의하지 않으면 안됩니다. 이 매크로의 가장 큰 장점은 사실 이후에 추가 할 수 있으며 제어하지 않는 구조체에 사용된다는 것입니다.코드 생성을 피하는 것이 아니라, 특히 (단순한) 경우에 그렇습니다. 그러나 '진짜'수업을 다룰 때는 코드 생성을 권하지 않습니다. 정말 어색해지기 쉽습니다. -> 나는 다른 언어를 배우고 내 표현력을 생성기로 줄이는 것이 무의미하다고 생각합니다. 내향 공격의 층이 많을수록 자신이하는 일을 통제하기가 더 어려워집니다. –