TCP ソケット経由で Java クライアントから C サーバーにいくつかの複雑なオブジェクトを送信したいと考えています。
どうやってやるの ?
基本的に問題は、「言語にとらわれない方法でオブジェクトをシリアル化/逆シリアル化する方法は?」具体的には、あなたの場合は Java と C です。このデータをネットワーク経由で送信するため、ネットワークの順序/エンディアンの問題に注意することも重要です。
クライアントとサーバーの両方にアクセスできると仮定します。これは、データをシリアル化する方法を選択できることを意味します。(そうでない場合、答えは簡単です。他の人が期待しているものの仕様に合わせて書いてください)
個人的には、Protocol Buffersを使用します。Java バインディング とC バインディングがあります。
Protocol Buffers が気に入らない場合は、次のような他のオプションがあります。
Java オブジェクトのフィールドを文字列 (おそらくJSON ) に書き込み、TCP 経由で送信し、C プログラムに文字列を読み取らせ、それを使用して相手側で新しい C 変数を初期化します。
この質問はかなり古いものですが、まだ良い解決策を探している人がいる場合に備えて、@Adam Liss による以前の回答で述べたように、プロトコル バッファの実装を試すことができます: (developers.google.com/protocol-buffers /)
つまり、プロトコル実装のように複雑なメッセージ タイプを定義すると、ツールはそれをシリアル化および逆シリアル化できる C++/Java/Python コードを生成します。
C コードを使用した同じ目的のために、ドイツのミュンヘン工科大学 (TUM) の研究プロジェクトは、組み込み C プロジェクトで使用できる標準 C のコード ジェネレーターを作成しました。これは、Google の protobuf 実装と完全に互換性があります (C 構造体による制限があります)。これは、リンクするライブラリを必要としないため、 C バインディングよりもうまく機能します。サポート ライブラリとリンクする必要があるため、使用している組み込みシステムでC バインディングを動作させるのに問題がありました。
これにより、組み込みシステムと Android アプリ (Java)/デスクトップ アプリ (C++/Qt) の間で複雑なネットワーク データ (要求応答) を渡すという、組み込みプロジェクトでの (苦痛な) 1 日を節約できました。