問題タブ [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::archive が保存/ロードするファイル名を取得する方法
serialize 関数または構文を持つその他の関数内で、アーカイブからファイル名文字列を取得する方法を知りたいと思っていました。template<class archive>
ありがとう!=)
c++ - ブーストで polymorphic_text_archive を使用してprimitive_typeクラスをシリアライズする
ブーストでユーザー定義のプリミティブ型クラスをシリアル化する方法を説明する次のサンプル コードをテストしようとしていますが、正常に動作します。コンパイルに失敗し、修正に苦労しています(vc++2008でテスト中)。
すべてのコードは、次の 3 つのリンクにあります。http://www.boost.org/doc/libs/1_46_1/libs/serialization/test/test_primitive.cpp http://www.boost.org/doc/libs /1_46_1/libs/serialization/test/test_tools.hppおよび libs/1_46_1/libs/serialization/test/text_archive.hpp
エラーを取得するには、次のように text_archive.hpp のヘッダーと typedef をポリモーフィックなものに変更してください。
使用されるプリプロセッサ フラグ:
BOOST_ALL_DYN_LINK;BOOST_FILESYSTEM_NO_DEPRECATED;BOOST_FILESYSTEM_VERSION=3
エラーメッセージ:
------ ビルド開始: プロジェクト: TestSer4、構成: Win32 のデバッグ ------
コンパイル中...
test_primitive.cpp
c:\program files\boost\boost_1_46_1\boost\archive\detail\oserializer.hpp( 88) : エラー C2664: 'void boost::archive::polymorphic_oarchive_impl::save(const bool)' :
パラメーター 1 を 'const A' から 'const bool'
に変換できません これを実行できるユーザー定義変換演算子はありませんc:\program files\boost\ boost_1_46_1 \boost\archive\detail\
oserializer.hpp
(232) : 関数テンプレートのインスタンス化への参照を参照してください 'void boost::archive::save_access::save_primitive(アーカイブ &,const T &)' [でコンパイル
されている
Archive=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\archive\detail\oserializer.hpp(308) : 関数テンプレートのインスタンス化への参照を参照 'void boost::archive: :detail::save_non_pointer_type::save_primitive::invoke(Archive &,const T &)' は [ Archive=boost::archive::polymorphic_oarchive, T=A ] c:\program files\boost\boost_1_46_1\boost\ で
コンパイル
さ
れ
て
い
ますarchive\detail\oserializer.hpp(525) : 関数テンプレートのインスタンス化への参照 'void boost::archive::detail::save_non_pointer_type::invoke(Archive &,const T &)' で
コンパイル
[
Archive=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\archive\polymorphic_oarchive.hpp(122) : 関数テンプレートのインスタンス化への参照を参照 'void boost::archive:: save(Archive &,T &)' は [ Archive=boost::archive::polymorphic_oarchive, T=A ] c:\program files\boost\boost_1_46_1\boost\archive\detail\interface_oarchive.hpp(63)でコンパイル
されています:関数テンプレートのインスタンス化 'void boost::archive::polymorphic_oarchive_impl::save_override(const boost::serialization::nvp &,int)' でコンパイルされている参照を参照して ください
[
T=A
]
c:\program files\boost\boost_1_46_1 \boost\archive\detail\polymorphic_oarchive_route.hpp(171) : 関数テンプレートのインスタンス化への参照を参照 'Archive &boost::archive::detail::interface_oarchive::operator < <(T &)' は [ Archive=boost::archive::polymorphic_oarchive, T=const boost::serialization::nvp ] c:\apps\proj\serilization\testser4\testser4\test_primitive.cpp(73) で
コンパイル
さ
れ
て
い
ます: 関数テンプレートのインスタンス化への参照 'boost::archive::polymorphic_oarchive &boost::archive::detail::polymorphic_oarchive_route::operator <<>(const boost::serialization::nvp &)'コンパイル中
with
[
ArchiveImplementation=boost::archive::text_oarchive_impl,
T=A
]
ビルド ログが「file://C:\apps\proj\Serilization\BusSchedEx\BusSchedEx\Debug\BuildLog.htm」に保存されました
TestSer4 - 1 エラー( s)、0 警告
========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========
助けてください。
c++ - Boost.Serialization: シリアル化プロセス中のクラス メソッドの呼び出しに関するエラー
シリアル化プロセス中に「TestSerialize」クラスでメソッドを呼び出そうとすると、次の問題が発生します。
これが私のコードです:
私が遭遇したエラーは次のとおりです。
このエラーは「保存」でのみ発生し、「読み込み」では発生しません
なぜこのエラーが発生するのだろうか。Boost.Serialization がこれら 2 つの異なる動作をするようにする方法を知りたいです。Boost Library 1.47.0を使用しています
c++ - ブーストシリアル化のロードは例外がスローされて失敗します
私は長い間この作品を作ろうとしてきました。
私のプロジェクトでは、テンプレート関数serializeを実装することにより、boostの正確なチュートリアルを使用してシリアル化されている6つのクラスがあります。
それらのクラスは、State、guState、Policy、Action、Param、Vec3Dです。
それらをシリアル化して保存すると、正常に動作します。確かに、さまざまな数字と文字列を含むテキストファイルを取得します。
不平、警告、例外はスローされません。唯一のケースは、クラスのポインターメンバーをシリアル化しようとすると、ホールプロセスがゾンビになることです。だから私はそうしようとはしません、そして節約はうまくいきます。
ただし、ロードしようとすると、次のようになります。
'boost :: archive :: archive_exception' what():ストリームエラーのインスタンスをスローした後に呼び出された終了
ここで興味深いのは、2つのboost :: ptr_vectorsをシリアル化することです。1つはStateポインターで構成され、もう1つはPolicyポインターで構成されます。
状態ベクトル、問題なく保存してロードしました。ポリシーベクトル、保存できますが、ロードしようとすると例外が発生します。
さらに、ブーストチュートリアルを読んだ後、ロードするためにシリアル化機能以外は何も必要ないという印象を受けました。
ただし、ロードしようとすると、ブーストシリアル化により、State()、Policy()などのデフォルトコンストラクターが見つからないと文句が言われます(各クラスに独自のコンストラクターを実装します)。
ここでこのチュートリアルを読んだ後、ブーストシリアル化が機能するように、何もしないデフォルトのコンストラクターを実装しました。確かにそれはコンパイルされました、そして私は上記の結果を得ました。
save_construct_dataとload_construct_dataを分離して実装しようとした、ここでの古い質問に見られる非常に複雑な道を進んでみましたが、これはあまりにも煩わしいと感じました。ここでも、上記の正確なエラーが発生しました。
誰かが私を助けてくれますか、ロードがどのように機能するか、デフォルトのコンストラクターとの関係は何ですか?または、少なくとも役立つかもしれないリンクを教えてください。私はブーストでマニュアルを読みました、そして、彼らは再建について多くを説明しません。
ありがとうございました。
編集(いくつかのスニペットを追加)
Stateから継承する他のクラスにも、以下を使用してシリアル化関数があります。
クラスポリシー:
ご覧のとおり、これらは2つの主要なクラスですが、他のクラスも再構築の依存関係のためにシリアル化されています(クラスAction、クラスParamなど)。
マスタークラス:
状態とポリシーを保持する2つのboost::ptr_vectorsが効果的に含まれています。状態は問題なく保存およびロードされます。
ポリシーをロードするときに問題が発生します。それらを保存しても問題は発生しないようです(ただし、間違っている可能性があります)。
ポリシーなしで、およびポリシーを使用して保存/読み込みをテストしたところ、問題はポリシーの再構築にあるようです。
シリアル化によってのみ使用されるデフォルトのコンストラクターに注意してください。これがないと、コードはコンパイルされません。
編集#2:valgrindとmemcheckを使用してアプリケーションを実行した後、ポインターメモリリークがあることを報告します。ただし、valgrindを使用したデバッグは得意ではないため、リークが発生している場所や、シリアル化に関連しているかどうかはわかりません(そうだと思います)。
c++ - Boost.SerializationとBoost.Python双方向ピクルス
Boost.Serializationを使用するC++ライブラリがあります。Boost.Pythonを使用して、このライブラリのPythonバインディングを作成しています。Boost.Serializationを使用するBoost.Pythonのピクルススイートを作成する方法はかなり明確です(Boost.Serializationを使用して文字列に保存し、その文字列をPythonに返します)。
私が欲しいのはその逆です。与えられたboost::python::object
場合、serialize(...)
Pythonのpickle.dumps()
関数を呼び出し、結果の文字列をシリアル化する関数が必要です。(想像してみてくださいstd::vector<boost::python::object>
。このベクトルをシリアル化すると、Boost.Serializationは補助serialize()
関数を呼び出します。)これは可能ですか?cPickle
さらに良いことに、Pythonインタープリターに制御を与えることを使用およびバイパスすることは可能ですか?
progress - ブーストシリアル化の進行状況インジケーター
ブースト シリアル化を使用してドキュメント構造を実装していますが、ドキュメントの保存/読み込みに時間がかかる場合があります。保存/読み込みがどこまで進んだかを示す進行状況を示す必要があります。
これにブースト iostreams ソースを使用する方法はありますか? そうすれば、入力ストリームからデータを取得するソースを実装できます。
もっとアイデア?
c++ - LevelDBとstd::map
このアプリケーションではstd::map
、(キー、値)データを格納し、シリアル化を使用してそのデータをディスクに格納するために使用します。このアプローチでは、ディスクI / Oがパフォーマンスのボトルネックであり、キーを使用した値の検索はそれほど高速ではないことがわかりました。
私はLevelDBに出くわし、それを使用することを考えています。しかし、いくつか質問があります。
- LevelDBのドキュメントには、(文字列、文字列)キーと値のペア用に作成されたと記載されています。カスタムキーと値のペアに使用できないということですか?
- とLevelDBの違い
std::map
は、LevelDBが永続的でありstd::map
、メモリ内で機能することです。つまり、ディスクI/OのボトルネックがlevelDBにとってより問題になるということですか。
より具体的には、LevelDBがより良い選択であるかどうかを誰かが説明できますstd::map
か?
PS:hash_map
sを使ってみましたが、遅いようですstd::map
c++ - ブーストシリアル化によるコンパイルエラー
Boostシリアル化ライブラリをテストするための小さなサンプルを作成しましたが、コンパイルに問題があります。
まず、コードは次のとおりです。
次の行でコンパイルエラーが発生します。
と
エラーは次のとおりです。
に一致するものはありませ
operator>>
ん'iixml >> boost::serialization::make_nvp(const char*, T&) [with T=MyClass(((MyClass&)(&d)))]'
これの意味について何か考えがありますか?
c++ - SQL Server xmlデータ型を介して、xmlとの間でシリアル化例外をブーストします
わかりました、これが私の問題です。
シリアル化によってxml文字列を作成するブーストオブジェクトがありますが、これは問題なく機能します。
ブーストバージョン1.38の使用
そのxml文字列を取得し、SQLサーバーデータベーステーブルにxmlデータ型で保存します。これも正常に機能します。
次に、データベーステーブルからxml文字列を取得しますが、フォーマットが挿入されたときからわずかに変更されており、基本的に空白の値に短いタグが付けられています<data></data>
。<data/>
前後のxmlの例を次に示します。
前
後
これも問題なく、完全に受け入れられ、予期しないことではありません。
このxml文字列を取得して、xmlをboostオブジェクトにシリアル化しようとすると、問題が発生します。xml文字列の短いタグ付きタグに遭遇すると、例外がスローされます。
私はこれでレンガの壁にぶつかりましたが、問題を解決する方法がわかりません。また、Webでこの問題への参照を見つけることができないため、助けていただければ幸いです。
:)
これが私のコードです。問題なくコンパイルできるはずです。db部分の空白を埋めるだけです。
grid.hpp
main.cpp
c++ - Boostを使用して(ネストされた)マップを変数にシリアル化するにはどうすればよいですか?
私は次のようにクラス内で宣言されたマップを持っています:
そして、ブーストを使用して、それを変数にマップするだけでシリアル化できるようにしたいと思います。
例はクラス全体をシリアル化しているようですが、これを行う必要はありません。また、ファイルに書き込んでいますが、マップの状態をファイルにアーカイブする必要がないため、後で復元できるように表現するだけで、非効率に思えます。
今、私は地図を保存するためにこれを持っています:
そしてこれを復元するには:
しかし、それは機能していません。誰かが私にいくつかのヒントを教えたり、マップをシリアル化して復元する方法を教えてもらえますか?
ありがとうございました。
編集: 私は私の例をより詳細に更新し、K-balloとKarl Knechtelからの回答を考慮に入れました(ありがとう!)。これにより、上記のコメント行でのブーストシリアル化の静的警告である1つを除いて、ほとんどすべてのエラーが解決されました。警告は次のとおりです。
この警告を解決してコンパイルする方法はありますか?ありがとう!
編集: 私の問題は2つありました:追加する必要がありました:BOOST_CLASS_TRACKING(例、track_never)そして、クラス全体をシリアル化し、マップのシリアル化を解除しようとしていました。