2009-09-09 5 views
2

2 대의 컴퓨터에 분산 된 4 개의 프로세스로 구성된 분산 C++ 응용 프로그램이 있습니다. 하나의 응용 프로그램이 나머지 응용 프로그램의 "제어 센터"역할을합니다.모듈 방식으로 C++ 응용 프로그램 상태를 저장하고로드하는 방법

파일에 현재 상태를 저장하고 나중에 다시로드 할 수 있기를 원합니다. 정확히 "상태"는 시스템의 각 모듈에 의해 개별적으로 정의됩니다. 저장시 모듈 상태는 하나의 파일에 결합되어야합니다. 로드 할 때 각 모듈은 상태 데이터를 파일에서 다시 읽어야합니다.

상태는 일부 사용자가 편집 할 수 있으므로 사람이 읽을 수있는 텍스트 파일로 저장해야합니다. 따라서 바이너리 파일 형식은 옵션이 아닙니다. 또한 XML 또는 YAML과 같은 표준 파일 형식이 선호됩니다.

방금 ​​설명한대로 상태 저장 /로드를위한 기본 프레임 워크를 구현하는 것이 어떻습니까? 나는이 작업에 필요한 최소한의 데이터 직렬화 작업을 선호한다. 또한 프레임 워크는 향후 저장 될 데이터를 쉽게 추가 할 수 있어야합니다.

답변

7

boost.Serialize lib를 살펴보십시오. 그것은 (xml) 파일에 객체를 스트리밍하는 데 아주 좋은 라이브러리입니다.

로드 및 저장 함수를 작성하는 대신 클래스는 serialize 함수 만 작성하면되며이 함수는 두 가지 방식으로 작동합니다.

class X 
{ 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & make_nvp("degrees(=xml_tagname)", degrees); 
     ar & make_nvp("minutes(=xml_tagname)", minutes);; 
     ar & BOOST_SERIALIZATION_NVP(seconds); // =auto xml tag 
    } 
} 
2

XML을 사용하십시오. 각 클래스에 저장 및로드 기능이 있어야합니다. 그런 다음 XML에서 최상위 레벨 태그를 클래스 이름으로 둡니다. 그런 식으로 다시로드 할 때 사용할 클래스를 찾아 본 다음로드 함수를 호출 할 수 있습니다.

1

나는 분명 XML쪽에 있습니다. 프로세스 식별자 태그에 각 프로세스별로 저장된 데이터를 포함하는 것이 유용 할 것입니다. 우리는 플러그인에 포함 된 데이터를 저장 /로드하기 위해 우리의 응용 프로그램에서 비슷한 시스템을 사용하며 매우 편리하게 확장 할 수 있습니다.

내 첫 번째 방법이 될 것입니다 :

  1. 제어 센터 (CC)의 저장 시작합니다.
  2. CC는 각 프로세스에 저장 신호를 보냅니다.
  3. 각 프로세스는 프로세스 식별자를 포함 XML 자체의 일부를 형성하고
  4. CC는 이러한 XML 조각을 수집 CC로 전송하고 는 & 디스크에 저장 한, 큰 파일로 결합합니다.
  5. 로딩

:

  1. CC는 XML 파일을 읽습니다.
  2. 식별자 식별자를 발견하면 적절한 부분을 해당 프로세스 에로드 신호로 보냅니다.
  3. 각 프로세스가 자신의 파트를로드하고 이로드 완료 신호를 CC로 보냅니다.
  4. 모든 프로세스가 완료되면 로딩이 시작되고 CC는 시작 신호 을 보내고 정상적인 워크 플로를 시작합니다.