2011-01-13 15 views
5

私は2つのコンポーネントを持つ分散アプリケーションを開発しています。 1つは標準C++(マネージドC++ではなく、Linuxプラットフォームで実行されています)で書かれ、もう1つはC#で書かれています。どちらもメッセージバス経由で通信しています。C++とC#のバイナリシリアル化/逆シリアル化

オブジェクトをC++からC#アプリケーションに渡す必要があるため、これらのオブジェクトをC++でシリアル化してC#でデシリアライズする必要があります(マーシャリング/ .NETでのマーシャリング解除など) 。私はバイナリでこのシリアル化を実行する必要があります(パフォーマンス上の理由から)。

Boost.Serializationは、両端がC++で実装されているが、片方の側に.NETアプリケーションがあるため、Boost.Serializationは実行可能な解決策ではありません。

私は、C++と.NETの境界を越えて(de)シリアライズを実行できるソリューション、すなわちクロスプラットフォームバイナリシリアル化を探しています。

私はC++ DLLに(de)シリアライゼーションコードを実装し、.NETアプリケーションでP/Invokeを使用することができますが、最後の手段としてそれを保持したいと思います。

また、私はgzipのような標準を使用しているかどうかを知りたいと思いますが、これは効率的でしょうか? gzipに代わる方法はありますか?彼らの長所と短所は何ですか?

ありがとうございました

+0

私の最高の提案はしないことです。 json、xmlなどを使用してデータを転送します。それが遅すぎると時間がかかっているかどうかを分析してください。 – Cine

+1

XMLシリアル化から始めましたが、バイナリシリアル化(両端でC++アプリケーションを実行している)と比較して遅くなっています。これがBoost.Serializationを最初に選択した理由です。 –

+0

シンプルなCOMアプリケーション、C++、およびC++の開発を検討しましたか?NETは私が知る限りCOM技術をサポートしています。 –

答えて

4

gzipのシリアライズとない直接役立ちます - それだけで(試みに)ストリームを縮小します。こののヘルプは、ストリーム内の重複データの量によって異なります。テキストの少ない高密度データの場合、gzip が増加し、ペイロードのサイズがになっています。

私はprotocol buffersを個人的に見ています(しかし、私はmany extensionsの作者の一人ですので、私は偏っています)。一般的に(常にではない)基本言語(.protoファイル)でメッセージを定義し、言語固有のツールを実行してクラスを生成します。パフォーマンスは非常に良いです - .NETに焦点を当て、それははるかは別の可能性は​​になり、それがさらにバックエンドを持っているし、必要な場合はために必要なコードの良い部分を提供作り付けのシリアライザ(123

+0

+1のためのPBの提案 –

5

私は、Googlesのシリアル化ライブラリであるプロトコルバッファをお勧めします。 .NET、C++、Javaのシリアライザの両方を備えています。ほとんどの実装も非常に高速です。

http://code.google.com/p/protobuf/

+0

ありがとう提案のために。私はそれを調べるだろう。 –

3

を超えることができますネットワーク通信 - スケールアウトしたい場合

簡単なオブジェクトのシリアル化が必要な場合は、json.orgを参照してください。C++/.NETの実装はたくさんあります。