私が取り組んでいるプロジェクトは、多数のカスタム ハードウェア デバイスを管理する 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 コンテナーはありますか?