2011-11-08 4 views
1

내 응용 프로그램에 boost::variantboost::serialize을 사용하고 있습니다. 직렬화 모듈에는 변형을 직렬화하기위한 지원이 내장되어 있으므로강력한 boost :: variant serialization

boost::variant<int,double> u(3.14); 

// Do something with u; 

// Serialize 
oa << u; 

이 작동합니다. 그러나, 제 문제는 직렬화가 강력하지 않다는 것입니다. 내 응용 프로그램이 컴파일되는 방식에 따라 변형의 요소가 변경 될 수 있습니다. 현재 직렬화 모듈은 단순히 '활성'변형 유형의 색인을 포함하는 것으로 보입니다. 변형이 예를 들어 boost::variant<double,string>으로 변경된 경우 문제가됩니다.

직렬화/비 직렬화가 작동하여 형식이 serialize 된 형식이 boost::variant의 템플릿 매개 변수가되도록이 방법을 개선하는 방법을 제안 할 수있는 사람은 누구나 있습니까? (위의 경우 boost::variant<int,double> u(3.14)boost::variant<double,std::string>으로 직렬화되지 않을 수 있습니다.이 유형의 문자열 형식과 같은 추가 정보를 제공해야 할 수도 있음을 알고 있습니다.

+0

왜 변형의 요소를 변경 하시겠습니까? 일반적으로 파일 형식 사양이 이와 같이 변경되는 것을 원하지는 않습니다. – Mranz

+0

보통 나는 프로그램 자체가 수치 시뮬레이션이라고 동의합니다. 시뮬레이션 클래스는 수천만 개의 가능한 조합이있는 템플릿이 많이 포함되어 있습니다. 분명히 나는 ​​그것들 모두를 실행 파일로 인스턴스화 할 수 없다. 내 사용자 기반을 모두 자체 컴파일하면 지원 인스턴스 생성을 유지하기 위해 변형을 사용하는 것이 합리적입니다. –

답변

3

기성품 메커니즘 당신이 뭔가를 원하는 경우 boost::variant<int,std::string>boost::variant<int,double>를 변경 한 경우는 어떻게해야 더 이상 배를 보유하지 수있는 예를 들어 그런 일을 사용할 수 있습니까? 대한? 예외를 던져?

것은 당신이해야 할 것 상상하는 것 기대하고있는 "케이스"의 정의에 맞게 직접 작성하십시오.

일부 파일 업그레이드 로직을 빌드 할 수도 있습니다 ... 예를 들어, 프로그램의 모든 버전 N은 (N-1, N-2 ...)에 대한 구조체 정의의 오래된 복사본을 유지하므로 능력을 제공하는 데 사용할 수있는 루틴을 작성할 수 있습니다 발생하는 오래된 파일을 업그레이드합니다.

하지만 실제로 프로그램을 야생화하기 전에 가능한 한 처음으로 파일 형식을 올바르게 가져 오는 것이 가장 좋습니다. 특히 사용자의 의도를 인코딩하는 데이터 (사실상 캐시에 불과한 파생 된 구조는 버려지거나 버전이이를 인식하지 못하면 다시 계산할 수 있음).