Я использую leveldb для хранения пар ключ-значение целочисленных и MyClass объектов. На самом деле ключ может содержать более одного из этих объектов.
У меня возникает проблема при получении данных из базы данных. Он компилируется, однако значения членов MyClass не являются теми, которые я положил в базу данных.
std::string value;
leveldb::Slice keySlice = ANYKEY;
levelDBObj->Get(leveldb::ReadOptions(), keySlice, &value);
std::string
value1
теперь может содержать только один объект MyClass или более. Так как мне их получить?
Я уже попробовал следующее, которое не сработало;
1.) Непосредственное приведение типов и memcpy
std::vector<MyClass> vObjects;
MyClass* obj = (MyClass*)malloc( value.size());
memcpy((void*)obj, (void*) (value.c_str()), value.size());
MyClass dummyObj;
int numValues = value.size()/sizeof(MyClass);
for( int i=0; i<numValues; ++i) {
dummyObj = *(obj+i);
vObjects.push_back(dummyObj);
}
2.) Reinterpret_cast для аннулирования указателя
MyClass* obj = (MyClass*)malloc( value.size());
const void* vobj = reinterpret_cast<const void*>( value.c_str() );
int numValues = value.size()/sizeof(MyClass);
for( int i=0; i<numValues; ++i) {
const MyClass dummyObj = *(reinterpret_cast<const MyClass*>(vobj)+i);
vObjects.push_back(dummyObj);
}
MyClass - это коллекция из нескольких открытых участников, например, unsigned int и unsigned char, и он имеет стабильный размер.
Я знаю, что есть похожие проблемы только с одним объектом. Но в моем случае вектор может содержать более одного, и это происходит из базы данных leveldb.
РЕДАКТИРОВАТЬ: РЕШЕНИЕ
Я написал (де) метод сериализации для MyClass, который затем заставил его работать. Спасибо за подсказку!
void MyClass::serialize( char* outBuff ) {
memcpy(outBuff, (const void*) &aVar, sizeof(aVar));
unsigned int c = sizeof(aVar);
memcpy(outBuff+c, (const void*) &bVar, sizeof(bVar));
c += sizeof(bVAr);
/* and so on */
}
void MyClass::deserialize( const char* inBuff ) {
memcpy((void*) &aVar, inBuff, sizeof(aVar));
unsigned int c = sizeof(aVar);
memcpy((void*) &aVar, inBuff+c, sizeof(aVar));
c += sizeof(aVar);
/* and so on */
}
Метод get
выглядит следующим образом (put
аналогично):
int getValues(leveldb::Slice keySlice, std::vector<MyObj>& values) const {
std::string value;
leveldb::Status status = levelDBObj->Get(leveldb::ReadOptions(), keySlice, &value);
if (!status.ok()) {
values.clear();
return -1;
}
int nValues = value1.size()/sizeof(CHit);
MyObj dummyObj;
for( int i=0; i<nValues; ++i) {
dummyObj.deserialize(value.c_str()+i*sizeof(MyObj));
values.push_back(dummyObj);
}
return 0;
}