[boost::variant, boost::serialization, boost::asio] Frage an die boost-Experten.



  • Hallo,

    Ich hab einen rekursiven boost::variant typ definiert der wie folgt aussieht:

    typedef boost::make_recursive_variant<bool,
                                          int,
                                          double,
                                          std::string,
                                          std::vector< boost::recursive_variant_ >,
                                          std::map<std::string, boost::recursive_variant_>,
                                          TGrey8Image,
                                          TRgbImage,
                                          TRgbaImage
                                          >::type TVType;
    

    Objekte dieses Typs würde ich nun gern in ein Message-Objekt packen, serialisieren und per boost::asio über eine tcp Verbindung schicken.
    Das Serialisieren und Deserialisieren in ein binary_archive als Datei oder std::stringstream funktioniert problemlos.

    Das Problem tritt auf wenn ich das variant Objekt auf der Gegenseite der tcp-Verbindung deserialisieren will. Dann bekomm ich ne Laufzeit-Assertion:

    testSerialization: /usr/include/boost/variant/detail/visitation_impl.hpp:203:
    typename Visitor::result_type boost::detail::variant::visitation_impl(int,
    int, Visitor&, VPCV, mpl_::true_, NBF, W*, S*) [with W = mpl_::int_<20>, S
    = boost::detail::variant::visitation_impl_step<boost::mpl::l_iter
    <boost::mpl::l_end>, boost::mpl::l_iter<boost::mpl::l_end> >, Visitor =
    boost::detail::variant::invoke_visitor<boost::detail::variant::direct_assigner
    <std::map<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> >,
    boost::variant<boost::detail::variant::recursive_flag<bool>, int, double,
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    std::vector<boost::recursive_variant_,
    std::allocator<boost::recursive_variant_> >,
    std::map<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> >, boost::recursive_variant_,
    std::less<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> > >, std::allocator<std::pair<const
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    boost::recursive_variant_> > >, CIS::Image2d<unsigned char>,
    CIS::Image2d<CIS::RGB>, CIS::Image2d<CIS::RGBA>,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_>, std::less<std::basic_string<char,
    std::char_traits<char>, std::allocator<char> > >,
    std::allocator<std::pair<const std::basic_string<char,
    std::char_traits<char>, std::allocator<char> >,
    boost::variant<boost::detail::variant::recursive_flag<bool>, int, double,
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    std::vector<boost::recursive_variant_,
    std::allocator<boost::recursive_variant_> >,
    std::map<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> >, boost::recursive_variant_,
    std::less<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> > >, std::allocator<std::pair<const
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    boost::recursive_variant_> > >, CIS::Image2d<unsigned char>,
    CIS::Image2d<CIS::RGB>, CIS::Image2d<CIS::RGBA>,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_> > > > > >, VPCV = void*, NBF =
    boost::variant<boost::detail::variant::recursive_flag<bool>, int, double,
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    std::vector<boost::recursive_variant_,
    std::allocator<boost::recursive_variant_> >,
    std::map<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> >, boost::recursive_variant_,
    std::less<std::basic_string<char, std::char_traits<char>,
    std::allocator<char> > >, std::allocator<std::pair<const
    std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
    boost::recursive_variant_> > >, CIS::Image2d<unsigned char>,
    CIS::Image2d<CIS::RGB>, CIS::Image2d<CIS::RGBA>,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_, boost::detail::variant::void_,
    boost::detail::variant::void_>::has_fallback_type_]: Assertion `false'
    failed.
    

    Was ich bisher versucht hab:

    • Google bemüht -> nix gefunden.
    • Nicht rekursiven variant-typ verschicken -> geht nicht
    • Variant-typ ganz aus dem Message Objekt rauslassen -> geht
    • Anderen compiler verwenden -> geht nicht
    • CVS-Boost verwenden und neu bauen
      -> geht nicht auf Ubuntu 6.10 g++-4.1.2
      -> geht auf Debian testing g++-4.1.2 ?????
    • Hab mich an die boost-mailingliste gewandt aber leider keine Hinweise
      erhalten.
    • Assertion auskommentieren -> Segfault

    Irgendwie riecht das alles nach einem Bug in boost oder Compiler bug. Wenn ich mir die Stelle anschau wo die Assertion steht sieht das so aus als ob der apply_visitor nicht ausgerollt wurde.

    Ich hoffe sehr dass mir vll. jemand weiterhelfen kann. Ich kann auch den ganzen Netzwerkcode posten falls es weiterhilft sind nur 300loc.

    Gruß,
    Falco


Anmelden zum Antworten