2014-04-04 3 views
0

나는 시리얼 매우 새로운 오전과 내가 (가능한 단순한) 질문이 있습니다 시리얼 - 여러 드 직렬화

가 거기에 내가 내부 개체의 수를 모를 때 여러 개체를 직렬화하는 방법을 (XML) 아카이브?

내가 좋아하는 뭔가를 시도 :

std::ifstream is("c:\\data.xml"); 
cereal::XMLInputArchive archive(is); 

while (is.good() && !is.eof()) 
{    
    try{ 
     ObjectIn oIn; 
     archive(oIn); 
     objectList.push_back(oIn); 
    } 
    catch (exception e){ 
    } 
} 

의가 내가하지 포함하는 개체 번호가 수신 XML 파일과 XML에서 3 개체가 있다고 가정 해 봅시다. 그래서, 내 코드에서, 처음 3 반복 OK,하지만 4 일 생성 "CerealTest.exe에 0x0035395E에서 처리되지 않은 예외 :가 0xc0000005 : 위치 0x00000018 읽기 액세스 위반."

의견이 있으십니까?

+1

에 오신 것을 환영합니다. 가능한 경우 디버깅을 사용하도록 컴파일해야 줄 번호가있는 예외를 게시 할 수 있습니다. 그리고 시도한 것을 설명하십시오 (http://stackoverflow.com/help/how-to-ask 참조). –

답변

2

나 귀하의 질문에 대답하기 전에 당신에게 질문을 물어 보자 : 당신이 항목의 알 수없는 수를 직렬화하는 경우, 왜 항목의 변수 수를 유지하기위한 약간의 용기에 그 물건을 올려 놓지? std::vector을 사용하여 ObjectIn을 저장하고 쉽게 처리 할 수 ​​있습니다. 그 시리얼로 시작하는 XML을 생성 가정, 직렬화 된 오브젝트의 수와

std::vector<MyObjects> vec; 
{ 
    cereal::XMLInputArchive ar("filename"); 
    ar(vec); 
} // get in the habit of using cereal archives in an RAII fashion 

위 작품 : 코드는 같을 것이다. XML 코드에서 벡터의 요소를 추가하거나 제거 할 수도 있습니다. 그러면 올바르게 작동합니다. 당신이이 같은 (그러나 이것이 좋은 생각이 아니다 경고 할 수 있습니다 요소의 변수 번호를 개최하도록 설계 컨테이너에 배치 오브젝트의 알 수없는 수를 읽고하지에 대한 끈질긴 경우


, - 당신은 정말 당신의 직렬화 전략을 변경하려고이 작업을 수행하지 않음)해야 다시

{ 
    cereal::XMLInputArchive ar("filename"); 
    try 
    { 
    while(true) 
    { 
     ObjectIn ob; 
     ar(ob); 
     objectList.push_back(oIn); 
    } 
    catch(...) 
    { } 
} 

날이 근본적으로 당신의 직렬화 전략에 문제가 있음을 강조하자 당신은 라 항목 대신 컨테이너를 직렬화한다 얼마나 많은 사람들이 있을지 모를 경우 위의 코드는 다른 것을 읽는 것을 처리 할 수 ​​없으며 예외가 발생할 때까지 맹목적으로 읽으려고합니다. 객체가 몇 가지 이름 지정 패턴을 따랐다면 이름 - 값 쌍 (cereal::make_nvp)을 사용하여 이름순으로 검색 할 수 있습니다. 에 StackOverflow에

+0

안녕하세요. 답변 해 주셔서 감사합니다. "오류 오류 C2338 :. 출력 보관과 unserializable 유형을 직렬화하려고 \t .. \ SRC \ 포함 \ 시리얼 성병 : : 벡터 또는 표준 : : 목록을 직렬화하려고 다음과 같은 오류가 발생합니다 당신이 목록 또는 벡터를 직렬화하는 경우 \ cereal.hpp \t 453 "... 첫 번째 예외에서 ... 액세스 위반 읽기 위치 – Metallaru

+0

또한, 시도/캐치 그냥 많이 제기, 작동하지 않았다 " types 폴더에 적절한 헤더를 포함해야합니다. – Metallaru

+1

을" – Azoth