diff --git a/src/ifcparse/IfcEntityInstanceData.cpp b/src/ifcparse/IfcEntityInstanceData.cpp index 222d7ee1f3..201701b6ed 100644 --- a/src/ifcparse/IfcEntityInstanceData.cpp +++ b/src/ifcparse/IfcEntityInstanceData.cpp @@ -285,7 +285,6 @@ bool impl::serialize(std::string& val, const aggregate_of_aggregate_of_instance: std::ostringstream oss; oss.put(TypeEncoder::encode_type()); - // size of outer aggregate auto write_size = [&oss](size_t sz) { std::string size_str; size_str.resize(sizeof(size_t)); @@ -293,11 +292,11 @@ bool impl::serialize(std::string& val, const aggregate_of_aggregate_of_instance: oss.write(size_str.data(), size_str.size()); }; - write_size(t->size()); + // write_size(t->size()); for (auto it = t->begin(); it != t->end(); ++it) { // size of inner aggregate - write_size(it->size()); + write_size(it->size() * 9); // values for (auto jt = it->begin(); jt != it->end(); ++jt) { @@ -409,9 +408,9 @@ bool impl::deserialize(IfcParse::impl::rocks_db_file_storage* storage, const std t.reset(new aggregate_of_aggregate_of_instance); char const* ptr = val.data() + 1; - size_t outer_size; - memcpy(&outer_size, ptr, sizeof(size_t)); - ptr += sizeof(size_t); + // size_t outer_size; + // memcpy(&outer_size, ptr, sizeof(size_t)); + // ptr += sizeof(size_t); while (ptr < val.data() + val.size()) { size_t inner_size; diff --git a/src/serializers/RocksDbSerializer.cpp b/src/serializers/RocksDbSerializer.cpp index 789e72af15..b30cd59530 100644 --- a/src/serializers/RocksDbSerializer.cpp +++ b/src/serializers/RocksDbSerializer.cpp @@ -72,8 +72,42 @@ namespace { bool serialize(std::string& val, const std::vector>& t) { - // @todo - return false; + std::ostringstream oss; + oss.put(TypeEncoder::encode_type()); + + auto write_size = [&oss](size_t sz) { + std::string size_str; + size_str.resize(sizeof(size_t)); + memcpy(size_str.data(), &sz, sizeof(size_t)); + oss.write(size_str.data(), size_str.size()); + }; + + // write_size(t.size()); + + for (auto it = t.begin(); it != t.end(); ++it) { + // size of inner aggregate + write_size(it->size() * 9); + + // values + for (auto jt = it->begin(); jt != it->end(); ++jt) { + char c = jt->index() == 0 ? 'i' : 't'; + oss.put(c); + size_t iden = 0; + if (auto* name = std::get_if(&*jt)) { + iden = *name; + } else if (auto* inst = std::get_if(&*jt)) { + iden = (*inst)->identity(); + } + std::string iden_str; + iden_str.resize(sizeof(size_t)); + memcpy(iden_str.data(), &iden, sizeof(size_t)); + oss.write(iden_str.data(), iden_str.size()); + } + } + + val = oss.str(); + + return true; } }