問題タブ [boost-serialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
boost - ブーストシリアル化ポリモーフィックレジスタ(エクスポート)がファイル間で機能しない
私はboost::serialization
自分のプロジェクトで使用しています。プロジェクトは大規模で、オブジェクトをいくつかの場所でシリアル化します。ここのドキュメントによると、2つの別々のステップでクラスをエクスポートする必要があります。
BOOST_EXPORT_KEY()
.h
ファイルでは、witchに宣言が含まれています。BOOST_EXPOET_IMPLEMENT()
ファイルで.cpp
は、witchにはエクスポートのインスタンス化(定義)が含まれています。
hier.h
クラス階層では、階層には3つのクラスがあります。
そして、ahier.cpp
には実装が含まれています:
そしてmain.cpp
、シリアル化を使用します。
問題なくコンパイルされましたが、実行すると次のようになります。
これは、派生クラスが登録されていないことを意味し、の登録が機能してhier.cpp
いないことを意味します。しかし、それは本当に奇妙です。なぜなら、次の理由からです。
実装がとの両方であると登録する
main.cpp
とhier.cpp
、リンク中に重複した定義が発行されます。での登録がOKであり、リンカーの可視性に公開されていることを意味します。hier.cpp
、それ以外の場合、重複した定義エラーは発生しません。にのみ実装を登録すれば
main.cpp
OKです。
私はその状況で本当に混乱しています。コメントや提案をいただければ幸いです。前もって感謝します。
c++ - boost ::serialization-std :: wstringsをバイナリシリアル化するポータブルな方法はありますか?
同じWindowsマシン上の32ビットプロセスと64ビットプロセスの間で、boost::serializationを使用していくつかのデータ構造をシリアル化したい。
この回答は、eos :: portal_iarchiveの使用を提案していますが、それを試したところ、STATIC_ASSERTエラーが発生しました。
std :: wstringsもサポートする別の方法(パフォーマンスの考慮事項に使用したくないtext_iarchive以外)はありますか?
c++ - シリアル化の強化:ストリームが「良好」かどうかを確認します
私は現在、クライアントからシリアル化されたデータを受信し、それを逆シリアル化し、最後に処理する必要があるサーバーアプリケーションを開発しています。シリアル化されたデータは、charの配列の形式で送信されます。私の問題は、無効なデータを送信することでアプリケーションが簡単に壊れてしまう可能性があることです。そこで、文字列(-stream)をチェックして、データを取得する前に(逆)シリアル化に適しているかどうか(たとえば、有効な署名があるかどうか)を確認できるかどうかを確認したいと思いました。
ちなみに、タイトルがすでに言っているように、私のアプリケーションはboost.serializationを使用しています。
よろしくお願いします:)
boost - Boostを使用してMFCコレクションをシリアル化する方法
これまでのところ、MFCベースのプロジェクトでBoostシリアル化を使用しようとしていますが、運が悪かったのですが、シリアル化がCArrayのメンバーではない、またはシリアル化がCMapのメンバーではないなどのエラーが発生しました。
MFCコレクションをシリアル化する方法がわかりません。
Boost APIを使用してMFCコレクション(CString、CMap)を正常にシリアル化および逆シリアル化するコードが付属している人はいますか?
前もって感謝します
c++ - BOOST_CLASS_EXPORTにより、main()の最後でセグメンテーション違反が発生しますか?
boost::serialization
私はクラスに使用します。私にはいくつかの継承があるのでBOOST_CLASS_EXPORT
、クラスを「登録」するために使用する必要があります。私が何も誤解しなかったことを望みます。
私はこのマクロを使用します:
または私もこれを使用します:
MyClassの定義も含まれているMyClass.hなどの1つのヘッダーファイル。ただし、マクロをソース(* .cpp)ファイルの1つに入れようとしても、再び失敗します。
の終わりにセグメンテーション違反が発生しmain()
ます。Stacktraceは、コールスタックがこの問題とほぼ同じであることを示しています。この問題の解決策や回避策が見つかりません。問題はデストラクタのせいだと思いますが、どうすれば解決できるのかわかりません。これが私のせいであるとか、ブーストのバグであるとさえ言えません。(自分で直せるのは私のせいだと思います)
これに対する解決策/回避策はありますか?そして、なぜ問題が発生するのですか?
私のビルド環境は、Ubuntu 10.04 64ビットサーバー(カーネル2.6.32)、gcc 4.4.3、ブースト1.40です。(私はそれを見つけて、バージョンを見るために/usr/include/boost/version.hpp
使用します)apt-cache show libboost-dev
-Wall -g3 -O0
コンパイラオプションとして使用しています。
不思議なことに、問題は私のマシンの1つでのみ発生します。CentOS(カーネル2.6.18)、gcc 4.1.2、およびBoost1.41を実行している別のマシンはうまくいきます。
更新:プロジェクト全体を小さな例にまとめます。それは底に置かれ、私の要点でも利用できます。クラスは何もしません、そして(私の)プログラムは何もしません。それにもかかわらず、BOOST_CLASS_EXPORT
セグメンテーション違反が発生します。
f1.cpp
またはを削除するf2.cpp
と、問題が解消されることに注意してください(複数のコンパイルユニットが必要です)。同様の状態がとで発生しclass A/A_child
ますB/B_child
。1つのクラスだけで問題が発生しない理由がわかりません。
コード
コンパイル
f1.cpp
f2.cpp(f1.cppと同じ)
main.cpp
MyClass.h
c++ - Boost.Asio と Google プロトコル バッファ
私は現在、既存のバイナリ プロトコルを維持しながら、現在の C++ ネットワークの手作りのシリアル化メカニズムを改善する方法を調査しています。最初に取られたアプローチは、Boost.Asio とバイナリ シリアライゼーションを使用する Boost.Serialisation を使用してコーディングすることでした。とにかく、現在の手作りの実装よりもやや遅い (10%) ことが判明しました。Boost.Asio と一緒に google protobuf を使用することについて、実際の _real_work_ 経験がある人はいますか?
Google でサンプルを検索しましたが、次の例しか思いつきませんでした。
Google プロトコル バッファ サンプルで Asio をブーストする
実際のプロジェクトでこれを行った人はいますか? これは非常に高速でなければならないので、パフォーマンスの数値に非常に興味があります...
c++ - ロバストなブースト::バリアントシリアル化
私は自分のアプリケーションで使用boost::variant
しboost::serialize
ています。シリアル化モジュールには、バリアントのシリアル化のサポートが組み込まれているため、次のようになります。
動作します。ただし、私の問題は、シリアル化が堅牢ではないことです。アプリケーションのコンパイル方法に応じて、バリアントの要素が変わる可能性があります。現在、シリアル化モジュールは、「アクティブな」バリアント型のインデックスを単に埋め込んでいるように見えます。これは、バリアントがたとえばに変更された場合の問題ですboost::variant<double,string>
。
シリアル化されたタイプがのテンプレートパラメータであるようにシリアル化/非シリアル化が機能するように、これを改善する方法を誰かが提案できますかboost::variant
?(したがって、上記の場合、boost::variant<int,double> u(3.14)
シリアル化されていないboost::variant<double,std::string>
可能性があります。これには、型の文字列形式などの追加情報を提供する必要がある場合があることを認識しています。
c++ - C++11のstd::shared_ptrでboost::serializationを使用するにはどうすればよいですか?
のシリアル化用のBoostモジュールがあることは知っていますが、の何も見つかりません。boost::shared_ptr
std::shared_ptr
また、簡単に実装する方法もわかりません。次のコードが怖いです
動作しません。実際、あるオブジェクトが複数回参照された場合、そのオブジェクトはの最初の実行でロードされar>>r
、その後はポインタだけがコピーされます。ただしshared_ptr
、それを指す複数のオブジェクトを作成するため、複数回破壊します。
それについて何かアイデアはありますか?
私が使用しているシステムに関するいくつかの技術的な詳細:
- OS:Ubuntu 11.10(x64)
- コンパイラ:g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1
- ブーストバージョン:1.46.1(でインストール
sudo apt-get install libboost-dev
)
c++ - QTネットワークによるシリアル化とBoostによる逆シリアル化
初めて、HostileForkが私の問題を説明するのを手伝ってくれたことに感謝したいと思います。ありがとうございます !
バイナリプロトコルを介してデータを送信するクライアントとサーバーを構築しようとしています。
私の問題は、QTクライアントからBoostサーバーにクラスを送信したいということです。私のヘッダー(私のクラスのサイズである1つの整数)がソケットに書き込んでいます。サーバー側でヘッダーを読み取りたい場合、適切な整数を取得できません(代わりに、-13050660のような大きな数値があります)。サーバーでのデシリアライズに問題があると思いますが、よくわかりません。
これは、私のQtクライアントコードが番号10をソケットに書き込むために使用する手法です。
次に、boostのasync_read()を使用するサーバープロセスでそれを読み取ろうとします。
文字列の結果を操作する関数は次のとおりです。
32ビットの符号付き整数(4バイト)を取得しますが、10ではなく、-1163005939のようなものです。誰かが持っていて、なぜこれが機能しないのか考えていますか?
サーバーとクライアントはどちらも、64ビットのWindows7proで起動しています。
c++ - Boostを使用した抽象クラスのシリアル化中にエラーが発生しました
データ構造をtcpソケットに書き込むために、データ構造をシリアル化しようとしています。
これまでのところ、私の問題はシリアル化であることがわかりました。私も使ってみました
しかし、私のプログラムとそれを正しく実装する方法に似た実用的な例を見つけることができません。
これが私が訪れたリンクのいくつかです:
- http://programmers-blog.com/category/cc
- http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/tutorial.html#simplecase
- http://en.highscore.de/cpp/boost/serialization.html#serialization_class_hierarchies
私のデータ構造はこれより少し複雑ですが、私が次の構造を持っていると仮定しましょう
Coordinate.h
Move.h
MoveNormal.h
仮想メソッドはここで定義されています。
MoveNormal.cpp
私のmain.cppは次のようになります:
しかし、プログラムを実行すると、次のエラーが発生します。
Test.exeの0x76dbb9bcで未処理の例外:Microsoft C ++例外:メモリ位置0x001df078のboost :: archive::archive_exception。
VS2010とBoost1.48.0を使用しています。