Hi everybody, I'm writing code to deserialize data from various publish services with different idl's.
The code that I'm using to deserialize is:
void iBR::DynamicDataUtilities::deserializeChunks( DDSDomainParticipant* participant, std::queue<iBR::DataTypes::IBChunk>& chunks) { using namespace iB; INFO("DynamicDataUtilities", "chunks length: " + numToStr(chunks.size())); FILE* file = fopen("pruebas.dat", "a+"); RTICdrStream stream; RTICdrStream_init(&stream); for (unsigned int i = 0; i < chunks.size(); i++) { // Deserializing typecode... iBR::DataTypes::IBChunk chunk = chunks.front(); int typeLen = iBR::DataTypes::SERIALIZED_TYPE_MAX_LEN; char typeCodeBuffer[typeLen]; chunk.type.to_array((unsigned char*)typeCodeBuffer, typeLen); DDS_TypeCode *typeCode = iBR::TypeCodeUtilities:: deserialize_TypeCode(typeCodeBuffer, typeLen); DDSDynamicDataTypeSupport* typeSupport = new DDSDynamicDataTypeSupport(typeCode, DDS_DYNAMIC_DATA_TYPE_PROPERTY_DEFAULT); DDS_DynamicData* sample= typeSupport->create_data(); // Deserializing payload... int payloadLen = chunk.serialized_data_len; unsigned char payload[payloadLen]; chunk.data.to_array(payload, payloadLen); RTICdrStream_set(&stream, (char*)payload, payloadLen); //fwrite(payload, sizeof(char), payloadLen, file); sample->from_stream(stream); if (!(sample->is_valid())) { printf("deserialization data type problem!"); continue; } sample->print(file, 1); chunks.pop(); typeSupport->delete_data(sample); } fclose(file); }
IBChunk is a struct containing two buffers, one of them to save types and the other one to save payload/data.
Types are deserialized in a right way, but payload deserialization is wrong, it starts right, but it seems to be broken after the first field of the payload struct, the line in cuestion is:
sample->from_stream(stream);