2012-03-23 2 views
-1

직렬화에 대한 몇 가지 실험을 수행하는 동안 개체를 검색 할 때 내 개체 이름이 손실 된 것으로 나타났습니다. 무슨 일이 일어나는지 보여 주시겠습니까?개체 직렬화 중에 이름을 잃는 중

void nDB::serialize(macro* myMacro) { 
    ofstream ar("macro.dat", ios::binary); 
    ar.write((char*)myMacro,sizeof(*myMacro)); 
} 

macro* nDB::deserialize() { 
    macro* tmp_macro = (macro*)safemalloc(sizeof(macro)); 
    ifstream ar("macro.dat", ios::binary); 
    ar.read((char*)tmp_macro,sizeof(*tmp_macro)); 
    printf("My macro name is %s\n",tmp_macro->get_name()); 
    return tmp_macro; 
} 

그리고 이것은 내 출력

My macro name is \uffffs\uffff> 

가 대단히 감사합니다 무엇이며,

+0

개체 이름을 어떻게 저장하고 있습니까? –

+0

안녕 데이비드, 나는 객체 이름을 char * –

답변

0

는 당신은 당신의 개체에 대한 정적 메모리를 저장합니다. 객체가 사용하는 동적으로 할당 된 메모리 (예 : std::string, std::vector 또는 malloc 또는 new이 할당 된 항목)는 힙에 있으므로 메모리에 저장되지 않습니다. 동적으로 할당 된 모든 메모리를 serialize 및 deserialize해야합니다.

+0

@Binh로 저장합니다. [C++ Middleware Writer] (http://webEbenezer.net)는 이러한 세부 사항을 처리합니다. –

+0

안녕하세요, David. 이해합니다. 그러나 객체 이름은 정적으로 할당되며 블록이라는 다른 속성도 할당됩니다. 그러나 비트 필드로 저장했지만 이름은 저장되지 않은 블록을 검색 할 수있었습니다. 나는 무슨 일이 일어나고 있는지 전혀 모른다. 어떤 생각이 들었다면 도와주십시오. 고맙습니다, –

+0

@BinhVanPham 왜 코드를 게시하지 마십시오 –

2

당신이하고있는 일은 정의되지 않은 동작입니다.

당신이해야 하지이 (... 여전히 등) C 같은 구조를 조작하지 않는 한, C++에서 직접 메모리 조작 (특히 mallocfree)를 사용합니다.

직렬화 및 직렬화의 경우 적절한 라이브러리가 필요합니다 (또는 코드를 직접 작성해야하지만 필요한 전문 지식이 아직없는 것 같습니다).

Boost.Serialization을 사용하는 것이 좋습니다.

하지만 그 전에는 C++ 입문서 (list compiled here 참고)를 읽는 것이 좋습니다. 관용적 인 C++을 사용하지 않고, C와 같은 관용구를 사용하고 있습니다. 이것은 당신을 물 것입니다.

관련 문제