2012-10-04 5 views
2

C++에서 클래스를 직렬화하는 방법이 있습니까? 나는 클래스의 인스턴스가 아니라 클래스 자체를 언급하고있다. deserialize 할 때 어떤 클래스가 그것을 deserialize하는지 인스턴스화 할지는 모른다. 어떤 클래스가 표현되고 있는지를 어떻게 든 결정할 수 있고, 빈 인스턴스를 인스턴스화 한 다음 비 직렬화를 호출 할 수 있기를 원합니다. 설명에 대한C++에서 클래스 직렬화

편집 : 각 키는 강력한 형식의 값을 갖는 키 - 값 구조를 만드는 오전

. 어떤 키는 문자열을 저장해야하고, 다른 키는 int를 저장해야하며, 다른 키는 임의의 값을 저장할 수 있습니다. 나는 이것이 템플릿을 통해 컴파일러에 의해 시행되는 시스템을 고안했다.

Key 클래스는 두 개의 템플릿 매개 변수가 있습니다

  • UniqueClass -
  • 치형 (일반적으로 개념을 정의하는 처리기 기능에 정의 된) 개념 당 하나 개의 고유 한 클래스가 있어야한다 - 이것은 클래스입니다 이 개념에 대한 값이어야합니다.

Value 클래스는 추상 수퍼 클래스가있는 ValueType 만있는 템플릿 클래스이므로 boost :: any와 비슷한 클래스를 래핑 할 수 있습니다.

그럼 내 키 - 값 구조에 내가 가게를 가지고 있고 ConceptType과 치 형으로 템플릿되는 함수 검색 :

template<UniqueClass, ValueType> 
void store(Concept<UniqueClass, ValueType> concept, ValueType value); 

나는 개념의 값 유형을 설명하기 위해 같은 템플릿을 사용하고 있기 때문에과 일치하지 않으면 컴파일러가 불평 할 값으로 전달됩니다.

이제 키 - 값 저장소를 직렬화 할 수 있기를 원합니다. 따라서 어떻게 든 템플릿 기반의 Concept 클래스를 직렬화 한 다음 deserialization 중에 올바른 임의의 클래스를 인스턴스화해야합니다.

내가 serialize를 호출 할 수 있고 모든 적절한 객체가 스스로 직렬화하도록 요청할 수 있도록 직렬화하는 동안 인스턴스화 할 클래스가 무엇인지 알지 못하기 때문에 자체를 deserialize 할 것인지 묻습니다. 때문에 질문 편집으로 업데이트

+0

"클래스를 serialize"하는 것이 무엇을 의미하는지 설명하십시오. 일련 번호, 정의 (메소드/필드)? 정적 멤버들? – cdhowie

+0

작동하지 않는 코드를 표시하십시오. –

+0

귀하의 질문에서 즉시 분명하지 않지만, 당신은 두 가지 다른 것을 요구하고있는 것처럼 보입니다. 1) 역 직렬화 할 클래스의 유형을 결정하는 방법 (일부 직렬화 된 메타 데이터가 필요하고 일부 유형의 팩토리 패턴을 사용할 수 있음) 2) 내용을 실제로 직렬화하는 방법 (다양한 방법으로 수행 할 수 있음). 여기에 몇 가지 예가 나와 있습니다. http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html – Chad

답변

3

답변 :

내가 이해하면 수동으로 또는 역 직렬화를 통해 추가 할 때까지 컨테이너에서 0 키를 가지고있다. 이렇게하기위한 두 가지 방법이 있습니다 : 침입 및 비 관입.

관입

하자 Deserializable에서 Concept<U,T> 상속 : 이제

class Deserializable 
{ 
    public: 
     virtual void deserialize(InputStream& s) = 0; 
     virtual int getClassId() const = 0; 
}; 

, 당신은 getClassId()를 사용하여 검색 id를 통해 클래스를 식별 할 수 있습니다. 그래서, 다음은 공장을 만드는 것입니다. 여기서 포인트를 보여주기 위해 std::map과 함께 아주 간단한 것을 사용할 것입니다. 더 정교한 것을 자유롭게 사용하십시오.

typedef Deserializable* (*createDeserializableType)(); 
std::map<int,createDeserializableType> factory; 

// ... 

factory[id1] = &createMyClass; 
// etc... 

// ... 

// On deserialization 
createDeserializable create = factory[idReadFromStream]; 
if(create) 
    create()->deserialize(input_stream); 

그것도 당신이 Deserializable에 대한 store 방법을 추가하거나 Deserializable (나는 개인적으로 마지막 방법을 선호한다)에 당신이 store 방법을 추가하는 것을 의미한다.

비 침해

아이디어는 키 - 값을 직렬화하는 것입니다 당신이 그것을 만들고 그것을 추가하는 동시에 :

typedef void (*deserializeFctType)(InputStream&); 
typedef int id_type; 
std::map<id_type,deserializeFctType> factory; 

deserialize 방법은 바로 다음 역 직렬화 된 형식을 저장합니다 그것을 창조한다.

귀하의 질문에 명확하지 않은 점은 허용 목록의 목록이 유한한지 또는 무한한 지 여부입니다. 유한 타입 세트 만 "쉽게"직렬화 할 수 있습니다.

+0

좋은 답변, 정확히 내가 제안하려고했던 것 (지금은 그렇지 않습니다) :) – Chad