10

私が取り組んでいるプロジェクトは、多数のカスタム ハードウェア デバイスを管理する C++ アプリケーションです。アプリには、クライアント用のソケット/ポート インターフェイスがあります (GUI など)。各デバイス タイプには明確に定義された独自の JSON スキーマがあり、Cereal を使用してそれらを適切にシリアル化できます。

ただし、アプリはクライアントからの受信 JSON 要求も解析する必要があります。要求の一部でデバイス フィルタ パラメータが指定されています。これは、すべての式が AND で結合されている SQL の 'WHERE' 句にほぼ類似しています。例えば:

"filter": { "type": "sensor", "status": "critical" }

これは、クライアントが「クリティカル」ステータスのすべての「センサー」デバイスで操作を実行したいことを示します。表面的には、フィルター パラメーターの C++ 実装は std::map のように見えました。しかし、Cereal を使用してオブジェクトを逆シリアル化する実験を行ったところ、失敗しました。ハードコードされたフィルター マップをシリアル化すると、次のようになります。

"filter": [
   { "key": "type", "value": "sensor" },
   { "key": "status", "value": "critical" }
]

これで、Cereal がこの種の詳細なマップのシリアル化をサポートする理由が理解できました。結局、マップのキーは文字列以外の型である可能性があります。ただし、この場合、キー文字列です。

私は、Cereal を満たすためだけにインターフェイスの仕様を書き直して、クライアントが明らかに慣用的ではない JSON を生成することにあまり熱心ではありません。私はシリアルが初めてで、この点にこだわっています。このフィルターを std::map として解析するように Cereal に指示する方法はありますか? あるいは、私は間違った方法でそれを求めているのかもしれません。逆シリアル化する必要がある他の stl コンテナーはありますか?

4

1 に答える 1