代码之家  ›  专栏  ›  技术社区  ›  etjazz

具有命名空间基的派生类的Boost序列化无效xml标记

  •  1
  • etjazz  · 技术社区  · 12 年前

    如果我遇到如下情况,其中类B是从不同命名空间中的类a派生的,那么序列化oputput无法验证基类的标记名,从而产生“无效的XML标记名”。

    我该如何处理这种情况?

    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/serialization/base_object.hpp>
    
    namespace N {
    
    struct A
    {
        friend class boost::serialization::access;
        int m_a;
    
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & BOOST_SERIALIZATION_NVP(m_a);
        }
    };
    
    }
    
    
    
    struct B : N::A
    {
        friend class boost::serialization::access;
    
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(N::A);
        }
    };
    
    
    
    int main ()
    {
        B b;
        boost::archive::xml_oarchive ar(std::cout);
        ar << BOOST_SERIALIZATION_NVP(b);
    }
    

    输出为:

     <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <!DOCTYPE boost_serialization>
    <boost_serialization signature="serialization::archive" version="9">
    <b class_id="0" tracking_level="0" version="0"terminate called after throwing an instance of 'boost::archive::xml_archive_exception'
      what():  Invalid XML tag name
    The program has unexpectedly finished.
    
    1 回复  |  直到 12 年前
        1
  •  3
  •   jofel    12 年前

    当您使用不同的名称空间时, BOOST_SERIALIZATION_BASE_OBJECT_NVP BOOST_SERIALIZATION_NVP 不要工作。 相反,您需要使用 boost::serialization::make_nvp 在这两种情况下。