2

私は自分のソフトウェアで geos ライブラリをジオメトリ エンジンとして使用しています。現在、その capi を使用しています (推奨される API であるため)。

問題は、構造体 GEOSGeometry をシリアライズおよびデシリアライズしたいということです。ライブラリ自体は c++ であり、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

どんな助けでも大歓迎です。

4

1 に答える 1

0

まず第一に、ソース ファイル内の の定義に本当にアクセスできない場合は、C++11クラス、たとえば、、でstruct検査してみます。type_traitsis_podis_trivialis_standard_layout

こうすることで、自分が何を扱っているのかを理解することができます。が非常に単純であることがわかった場合は、structすべてのデータが内部に格納されていること、つまり他のメモリ領域を指していないことを「期待」できます。悲しいことに、私の知る限り、クラスがメンバー ポインターを持っているかどうかを確認する方法はありません。

最終的に、できることは、出力sizeof(GEOSGeometry)バイト ( chars) に残酷に書き込むことをシリアライズしようとすることだけです。それからそれを読み返してください... 頑張ってください!

于 2015-06-09T10:50:52.883 に答える