2013-02-13 3 views
1

프로젝트의 두 가지 분기에서 나오는 일부 데이터를 직렬화합니다. 데이터는 boost::serialization을 사용하여 텍스트 아카이브 형식으로 출력됩니다. diff가 두 개의 직렬화 된 파일간에 만들어지기 때문에 출력의 차이가 발생할 수있는 지점을보다 잘보기 위해 일부 직렬화 된 부분 사이에 직렬화 된 파일에 일부 디버그 메시지를 추가합니다. 여기 부스트 직렬화 - 문자열 길이 출력을 피 하시겠습니까?

내가 현재 사용하고 코드의 광범위한 개요입니다

std::ofstream ofs("./SomeFile.txt"); // for brevity's sake, no actual path used 
{ 
    boost::archive::text_oarchive oa(ofs); 
    std::string debug_str; 

    debug_str = "\n\nPart 1\n"; 
    oa & debug_str; 

    // ... some other serialized parts ... 

    debug_str = "\n\nPart 145\n"; 
    oa << debug_str; 
} 

당신은 내가 처음 사용 사업자 (<<&가) 출력의 차이를 한 것으로 생각 것을 알 수 있습니다, 아직 아무튼 't, 나는 다음과 같은 텍스트 파일을 얻을 :

22 serialization::archive 7 9 [CRLF] 
[CRLF] 
Part 1 [CRLF] 
11 [CRLF] 
[CRLF] 
Part 145 [CRLF] 

22 serialization::archive 7 부분은 내가 추측 아카이브의 유형을 식별, 표준 부스트 직렬화 헤더입니다. 이후에 내가 제거하고 싶은 부분, 즉 9이 나온다. - 거위를 쫓고 난 후에 나는 9"\n\nPart1\n" 문자열의 길이라는 것을 알아 냈다!

예상되는 동작입니까 아니면이 출력을 우회하는 방법이 있습니까? 다른 실제 기록의 경우 길이 등을 표시하는 다른 "제어 코드"를 명백히 사용하지 않습니다.

디버그 출력을 추가하는 것이 유용 할 수 있습니다. 그러나 디버그 문자열의 길이가 다를 수 있습니다 (분기 중 하나에서 심한 리팩토링이 발생하기 때문에 diff는 일부 오탐을 산출합니다).

의견을 보내 주셔서 감사합니다.

답변

2

나는 이것이 가능하다고 생각합니다.

여기에서 직면하는 문제는 텍스트 출력이으로 역 직렬화되어야 할 이어야한다는 것입니다.

  • 길이 접두사 문자열
  • 특수 문자 (이스케이프 코드로) 예를 들어

는 XML 아카이브 : 그것은 다시 쉽게 분석 할 수 있도록 구조화 텍스트 출력의 두 가지 방법이 있습니다 태그는 <>으로 둘러싸여 있으며, 사용자는 직접 문자를 사용할 수 없습니다. 대신 &lt;&gt;의 이스케이프 코드를 사용하십시오. 반면 Redis 포맷을 보면 13$Hello, World!과 같은 것을 볼 수 있는데, 레코드의 길이는 숫자의 문자열이고 그 뒤에 $가 붙어 실제 레코드가옵니다.

이전 방식 (길이 접두사가 붙은 문자열)은 훨씬 효율적이지만 인간의 쓰기가 훨씬 쉽습니다.부스트 :: 직렬화 문서에서

, 나는 두 개의 서로 다른 "사람이 읽을 수있는"아카이브를 참조하십시오

  • boost::text_[i/o]archive은 길이 접두사 문자열을 (보인다)
  • boost::xml_[i/o]archive는 XML 표현을 사용하여 사용

boost::xml_oarchive으로 전환 할 수 있습니다.

+0

신속한 답장을 보내 주셔서 감사합니다. 시험해 보겠습니다. – Dr1Ku

+0

XML 아카이브로 전환하는 것과 관련하여 너무 많은 오류가 발생하여 결국 문자열 길이로 살아야합니다. – Dr1Ku

+0

char 문자를 char로 삽입하려고 시도 했습니까? 문자열은 문자열을 직렬화 해제 할 수 있도록 길이가 필요합니다. 즉 크기를 알아야합니다. 크기를 알고있는 경우 9자를 직렬화/비 직렬화 할 수 있습니다. 크기가 없어야합니다. –