Я использую библиотеку Geos в своем программном обеспечении в качестве движка геометрии. В настоящее время я использую его Capi (так как это рекомендуемый API).
Теперь проблема в том, что я хотел бы сериализовать и десериализовать структуру GEOSGeometry. Сама библиотека находится на с ++, а capi является оберткой вокруг нее. Таким образом, определение структуры недоступно. Какие у меня варианты?
Это то, что упоминает капитан
/* When we're included by geos_c.cpp, those are #defined to the original
* JTS definitions via preprocessor. We don't touch them to allow the
* compiler to cross-check the declarations. However, for all "normal"* C-API users, we need to define them as "opaque" struct pointers, as
* those clients don't have access to the original C++ headers, by design.
*/
#ifndef GEOSGeometry
typedef struct GEOSGeom_t GEOSGeometry;
И вот как это завернуто
// Some extra magic to make type declarations in geos_c.h work -
// for cross-checking of types in header.
#define GEOSGeometry geos::geom::Geometry
Любая помощь приветствуется.
Прежде всего, если вы действительно не можете получить доступ struct
определение в исходном файле, я бы попробовал проверить его с помощью C ++ 11 type_traits
классы, например is_pod
, is_trivial
, is_standard_layout
…
Таким образом, вы можете понять, с чем имеете дело. Если вы видите, что struct
это довольно просто, вы можете «надеяться», что он хранит все данные внутри себя, то есть не указывает на другие области памяти. К сожалению, насколько я знаю, нет способа узнать, есть ли у класса указатель на член.
В конце концов, все, что вы можете сделать, это попытаться сериализовать это, жестоко записывая в ваш вывод sizeof(GEOSGeometry)
байты (char
с). Тогда прочитайте это назад и … удачи!