問題タブ [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.
c++ - Boost::SerializationおよびMFCDoc/Viewアーキテクチャ
XMLファイルにBoost::Serializationを使用するように既存のMFCC++アプリケーションを移植しています。私のCDocumentオブジェクトには、アプリのすべてのデータが含まれています。私はシリアル化機能を次のように実装しました:
保存イベントと読み込みイベントをキャプチャするために、CDoc * .cppファイルで、基本クラス関数OnOpenDocument()とOnSaveDocument()をオーバーロードして、Boost::Serializationを実装しました。
ドキュメントの保存は正常に機能します。問題は、ドキュメントのロードが機能しないことです。ポインタが別のアドレスに戻るため、BoostライブラリはCMyDocオブジェクトをコピーしているようです。これは、ロードされたファイルが現在のドキュメントにロードされていないことを意味します。CDocはブーストで自分自身を上書きできますか?MFCCArchiveで可能です。
この行を「POSSIBLEsolution」と表示することを考えましたが、これはCMyDocクラスのコピーコンストラクターを実装することを意味します。これにより、変数ごとに2行のコードがあるという点でブーストの利点の1つが削除されます。1。ar&BOOST_SERIALIZATION_NVP(m_Param1)//pDocに保存およびロードする2.this-> m_Param1 = pDoc.m_Param1 // in CMyDocコピーコンストラクタ
CMyViewをオーバーロードしてファイルを開いてイベントを保存すると、Doc/Viewアーキテクチャによって提供されるMRUリスト管理が実行されません。
これは何百万回も行われたと確信していますが、オンラインで情報を見つけることができません。変!どんな助けでも大歓迎です:D
ドキュメントを詳しく読むと、Boostは、シリアル化されたポインターが新しいキーワードで逆シリアル化されていることを認識していることがわかります。「ポインターのシリアル化は、次のようなコードでライブラリに実装されています。」
ドキュメントでは、必要に応じてこの関数をオーバーロードすることを推奨しています。
ただし、これもCMyDocコピーコンストラクターを実装する必要があります。Aaarrgghhhh !!
それが誰かを助ける場合に備えて、私はこれについてロバート・ラミーから返事をもらいました。基本的に、私は明らかな何かを見逃していませんでした。CMyDocserialize(Archive&ar、const unsigned int version)関数はランナーではなかったので、別々のboost_save関数とboost_load関数を実装しました。OnOpenDocumentとOnSaveDocumentをオーバーロードする必要がありました。次に例を示します。
BOOL CMyDoc :: OnOpenDocument(LPCTSTR lpszPathName){clear();
}
これが必要なのは、MFC CArchiveがMFCシリアル化機能が終了するまでファイルを所有し、boost::serializationがファイルにアクセスできないようにするためです。CDocument基本クラスは、基本クラスのSerialize関数に戻るときにarが存在すると想定しているため、Serialize関数でar.Abort()を呼び出しても機能しません。
c++ - マップのキーのみをシリアル化するboost::serialization
マップ付きのクラスがあり、boostserializeを使用してクラスをシリアル化したい。
ComplicatedThingは、intを知るだけで導出できます。これを効率的にシリアル化したい。1つの方法(うまくいきますが、機能します)は、キーのベクトルを作成し、そのベクトルをシリアル化することです。
しかし、これはエレガントではありません。BOOST_SERIALIZATION_SPLIT_MEMBER()とload / saveメソッドを使用すると、中間ベクトルの割り当てを完全にスキップできるはずです。そしてそこで私は立ち往生しています。
おそらく私の答えは、boost / serialization/collections_load_imp.hppを理解することにあります。うまくいけば、もっと簡単な道があります。
c++ - ストリームデータを保存するための最良の方法
私はゲームメッセージシステムを作成し、boost::serializeを使用してメッセージデータをストリームに変換して送信しています。ストリームへの参照を送信できるため、これはメッセージを即座に送信するために正常に機能します。
ただし、状況によってはメッセージもキューに入れたいと思います。データを保存するための最良の方法が何であるかわかりません。
私は試しstd::queue<std::stringstream>
ましたが、それは多くのエラーです。
std :: bitsetは半ば有望に見えますが、よくわかりません。
それとも、これは完全にばかげていますか?
boost - シリアライゼーションのエンドオブファイルをブースト
Boost を使用して、複数のオブジェクトをバイナリ アーカイブにシリアル化します。これらのオブジェクトを から読み戻す場合binary_iarchive
、アーカイブ内にいくつのオブジェクトがあるかを知る方法、または単にアーカイブの終わりを検出する方法はありますか?
私が見つけた唯一の方法は、try-catch を使用してストリーム例外を検出することです。前もって感謝します。
c++ - ブーストのシリアライゼーションの問題
クラス内に 2 つの配列を取得して、ブースト シリアライゼーション ライブラリを使用しようとしています。保存はできるのですが、なぜか読み込めません。ia >> *this; と一緒だと思います。しかし、私はそれを修正する方法がわかりません。誰でも私を正しい道に導くことができますか?
c++ - ブースト:シリアル化の再構築(読み込み)
私はboost:serializationを使用してデータ構造をファイルに保存しています。実際のデータは、クラスとサブクラスのポインターベクトルです。ただし、シリアル化されるクラスのコンストラクターは、シミュレーションAPI(webots)との通信を制御するオブジェクトである別のインスタンス化されたクラスAgentをパラメーターとして受け取ります。boost :: serializationの例では、シリアル化可能なオブジェクトには空のコンストラクターclass(){}が必要であることがわかります。再建に使用されます。しかし、私の場合、これは実用的ではありません。再構築を使用する方法はありますが、APIと通信するオブジェクトを含めることができますか?シリアル化可能なクラスの1つには、次のコンストラクターがあります。
ブーストドキュメントの例から、次のようなものが必要であることがわかりました。
ただし、エージェント&Aはパラメータとして渡す必要があります。これを回避する方法(extern、シングルトン、グローバルオブジェクトを使用)を見つける必要がありますか、それとも再構築時にこの動作を変更する方法がありますか?私はここで何かが欠けていると確信しています。
ありがとうございました
編集:たぶん私はこれを十分に明確に説明していませんでした。シリアル化されたデータを再構築して「ロード」しようとすると、エラーメッセージが表示されます。
これが私がboost::serializeコードを調べた理由であり、コンストラクターまたはコピー演算子を呼び出していると思います。特定のコンストラクターを使用してデータをシリアル化し、引数としてエージェント参照を取得するにはどうすればよいですか?
編集#2:
Statesは、boost :: serialization :: accessの友だちであり、serialize機能を備えています。保存は正常に機能し、読み込みが問題になります。状態は次のとおりです。boost::ptr_vector<S> states;
ここで、Sは状態ポリモーフィッククラスの一種です。
状態は基本クラスであり、「シリアル化」されています
guStateはStateを継承します。
accel、gyro、gpsは、3つのdouble変数を持つ単純な構造です。それらは上記でシリアル化されます^^。ポジションはstd::map<std::string,float> positions;
シリアル化されたテキストファイルを見ると、すべて問題ないように見えます。ファイルを読み込もうとしたときにコンストラクターを呼び出す理由がわかりません。
編集#3:
基本コンストラクターは次のとおりです。
派生したコンストラクターは次のとおりです。
各状態(または派生状態)に保持されるエージェント参照&Aは、シミュレーションAPIから取得されたオブジェクトを参照します。ロボットを制御します。シリアル化できません。シリアル化しても意味がありません。
私が使用するとき:
次のエラーが発生します。
コンストラクターから使用される参照を参照します。と:
ご覧のとおり、エージェントへの参照を保存しようとしても意味がありません。その参照は(保存またはシリアル化できたとしても)、アプリケーションが起動するたびに異なる可能性があるためです。
そして、構成データをロードする際に、おそらく間違った構文を使用していることを除けば、エージェントへのシリアル化された参照から構成することは意味がありません。
私が必要だと信じているのは、(エージェントオブジェクトを初期化した後)エージェントへの参照を取得し、その参照を使用してデータを構築する方法をload_construct_dataに指示する方法です。
それは意味がありますか?これは実行可能だと思いますか?
編集#4
guState::callerをシリアル化することはできません
また、クラスAgentをシリアル化可能にし、シミュレーションアプリからAPIを制御するためのAgentの新しいインスタンスを要求するために、Agentのload_construct_dataとsave_construct_dataをオーバーロードしました。
c++ - C++ 移植可能な配列のシリアル化
私が取り組んでいるプロジェクトでは、float / double の配列をネットワーク経由で前後に送信する必要があります。通信を非同期にする必要があるため、ネットワークに Boost.Asio を使用しています。そこにある最高の(唯一の本物?)...
送信される配列は float / double であり、型は両側で認識されています。私の知る限り、浮動小数点ストレージ標準に問題がある可能性があります+ long / int、エンディアンなどで発生するのと同じもの.
論理的には、送信される配列は密な行列であり、一方の端で Eigen によって処理され、もう一方の端で BLAS / [MKL|ATLAS] などを使用して処理されます。他の用途が必要になる可能性が非常に高いため、最も一般的な方法を使用します。可能な & 配列を渡しているようです。
クライアントとサーバーの両方が 32 ビットと 64 ビットの任意の組み合わせで実行される可能性があり、通信が非常に激しいため (リアルタイムの監視、クライアントの場合は数秒ごとに更新)、重要な要件は高いパフォーマンスと移植性です。そのため、シリアル化のオーバーヘッド自体は最小限に抑える必要があります。
私がこれまでに発見したことから、ここで検討すべき 2 つの大きなプレーヤーは、Boost.Serialization と Google の Protobuf です。
BS の大きな長所は、プロジェクトですでに Boost をかなり多く使用していることです (ただし、単体テストは Google Test にあります) make_array()
。それの大きな欠点はパフォーマンスです。
私が見つけたprotobufの利点はパフォーマンスです.すべてのベンチは、すべての操作でBSよりも10〜20倍優れていることを示しているようです. protobuf ドキュメントで見つけられなかったのは、メッセージに配列を追加することです。繰り返しフィールドを使用します。私が理解していることからMsgObject.repeatedProp.Add(const T&)
、配列の各要素で使用する必要があります。つまり、10k 配列に対して 10k 呼び出しを行う必要があり、それもコストがかかるようです。
C++ での私の経験は限られており、長い休憩の後、最近書き始めたばかりなので、これに取り組む方法についての提案は非常に高く評価されます...
c++ - Boostシリアル化を使用してBoostscoped_arrayをシリアル化するにはどうすればよいですか?
Boostシリアル化を使用してBoostをシリアル化しようとしてscoped_array
いますが、コンパイラ(VS2008)から次のエラーメッセージが表示されます。
シリアル化するにはどうすればよいscoped_array
ですか?これに含める必要のあるBoostライブラリはありますか?
c++ - boost::serialize がオブジェクトへの POINTER を取得したときに何が起こるかをオーバーライドする方法
ブーストが指しているオブジェクトのシリアル化関数を定義している限り、ブーストはポインターを自動的にシリアル化することを理解していますが、
を取るブーストシリアル化関数を書きたい場合はどうすればよいmyClass pointer
ですか?
ポイントされているオブジェクトを保存してから、それを指すポインターを復元するというデフォルトのアクションをブーストに実行させたくありません。ブーストで何か違うことをしたい。
c++ - boost :: serialization:overloading load_construct_data:アクセス可能なコンストラクターがまったくありません
そのため、boost :: serializationライブラリを使用しています。デフォルトのコンストラクタがないため、クラスの構築方法をオーバーライドしようとしています。これはここに示されています。私には、関数がを取り、class* t
新しく構築されたオブジェクトを指すように設定しているように見えます。私が間違っている場合、これは間違いなく私のエラーの原因です。
ただし、クラスを作成する唯一の方法は、別のクラスcreate()
関数を使用することです。つまり、例のコードから逸脱する必要があります(これは、boost :: serialization名前空間に記載されています)。::new(t)my_class(attribute);
create関数を呼び出してt
、返されたポインタと同じ値を設定しようとしましたが、の直後load_construct_data function
、およびでserialization function
、指定myClass&
されたものが't'に設定したものと同じではないため、これは機能しないようです。
:: new(t)が実行していることを実行して、create関数を使用して作成されたオブジェクトがserialize / other関数に続くようにするにはどうすればよいですか?