C++ boost序列化错误C4308:负整数常量转换为无符号类型

C++ boost序列化错误C4308:负整数常量转换为无符号类型,c++,serialization,boost,C++,Serialization,Boost,因此,我最近尝试使用boost::serialization序列化我的类,并正在阅读以下教程:。 我可以编译这个页面中的代码,但我不能编译我自己编写的代码。例如,在“类层次结构对象的序列化”一节中,我们有以下代码: #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/string.hp

因此,我最近尝试使用boost::serialization序列化我的类,并正在阅读以下教程:。 我可以编译这个页面中的代码,但我不能编译我自己编写的代码。例如,在“类层次结构对象的序列化”一节中,我们有以下代码:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

std::stringstream ss; 

class person 
{ 
public: 
  person() 
  { 
  } 

  person(int age) 
    : age_(age) 
  { 
  } 

  int age() const 
  { 
    return age_; 
  } 

private: 
  friend class boost::serialization::access; 

  template <typename Archive> 
  void serialize(Archive &ar, const unsigned int version) 
  { 
    ar & age_; 
  } 

  int age_; 
}; 

class developer 
  : public person 
{ 
public: 
  developer() 
  { 
  } 

  developer(int age, const std::string &language) 
    : person(age), language_(language) 
  { 
  } 

  std::string language() const 
  { 
    return language_; 
  } 

private: 
  friend class boost::serialization::access; 

  template <typename Archive> 
  void serialize(Archive &ar, const unsigned int version) 
  { 
    ar & boost::serialization::base_object<person>(*this); 
    ar & language_; 
  } 

  std::string language_; 
}; 

void save() 
{ 
  boost::archive::text_oarchive oa(ss); 
  developer d(31, "C++"); 
  oa << d; 
} 

void load() 
{ 
  boost::archive::text_iarchive ia(ss); 
  developer d; 
  ia >> d; 
  std::cout << d.age() << std::endl; 
  std::cout << d.language() << std::endl; 
} 

int main() 
{ 
  save(); 
  load(); 
} 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#include <iostream> 
#include <fstream> 
#include <boost/serialization/string.hpp> 
#include <string> 

class A
{
   friend class boost::serialization::access;
public:
   std::string a;
private:
   template<class Archive>
   void serialize(Archive& archive, const unsigned int version)
   {
        archive & a;
   }
};

class B : public A
{
   friend class boost::serialization::access;
public:
   std::string b;
private:
   template<class Archive>
   void serialize(Archive& archive, const unsigned int version)
   {
        archive & boost::serialization::base_object<A>(*this);
        archive & b;
   }
};

BOOST_CLASS_EXPORT(B) 

void save() 
{ 
  std::ofstream file("archive.xml"); 
  boost::archive::xml_oarchive oa(file); 
  B *myB = new B();
  myB->a = "1";
  myB->a = "2";

  oa << myB; 
  delete myB;
  file.close();
} 

void load() 
{ 
  std::ifstream file("archive.xml"); 
  boost::archive::xml_iarchive ia(file); 
  A *myB;

  ia >> myB;
  std::cout << myB->a << std::endl;
}

int main()
{
   save();
   load();
   std::cin.get();
}
你能告诉我我做错了什么吗?

被编译错误激怒了(目前也没有MSVC可供尝试)

那天结束时,我能够用MSVC2013进行测试。完整错误(警告)如下所示:

现在,您正试图通过poitner将多态类序列化到base,除非RTTI可用,否则这是没有意义的。为了实现这一点,该类至少需要1个虚拟方法


修复样本,使其正常工作:

我注意到缺少NVP包装。以下是编译版本:

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <iostream>
#include <fstream>
#include <boost/serialization/string.hpp>
#include <string>

class A {
    friend class boost::serialization::access;

  public:
    std::string a;
    virtual ~A() {}

  private:
    template <class Archive>
    void serialize(Archive &archive, const unsigned int version)
    {
        archive &BOOST_SERIALIZATION_NVP(a);
    }
};

class B : public A {
    friend class boost::serialization::access;

  public:
    std::string b;

  private:
    template <class Archive>
    void serialize(Archive &archive, const unsigned int version)
    {
        using namespace boost::serialization;
        archive &make_nvp("base", base_object<A>(*this));
        archive &BOOST_SERIALIZATION_NVP(b);
    }
};

BOOST_CLASS_EXPORT(B)

void save()
{
    std::ofstream file("archive.xml", std::ios::binary);
    boost::archive::xml_oarchive oa(file);
    B *myB = new B();
    myB->a = "1";
    myB->b = "2";

    A* myA = myB;
    oa << boost::serialization::make_nvp("myA", myA);
    delete myB;
    file.close();
}

void load()
{
    std::ifstream file("archive.xml", std::ios::binary);
    boost::archive::xml_iarchive ia(file);
    A *myA;

    ia >> boost::serialization::make_nvp("myA", myA);

    std::cout << "a: " << myA->a << std::endl;
    if (B* myB = dynamic_cast<B*>(myA))
        std::cout << "b: " << myB->b << std::endl;
}

int main()
{
    save();
    load();
}
为了完整起见,下面是相应的
archive.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="10">
<myA class_id="1" class_name="B" tracking_level="1" version="0" object_id="_0">
    <base class_id="0" tracking_level="1" version="0" object_id="_1">
        <a>1</a>
    </base>
    <b>2</b>
</myA>

1.
2.

哇,这真有效!但我很难理解这一点,这部作品与我写的作品有什么不同?是因为制作nvp还是虚拟类?为什么编译器无法编译我编写的代码?因为XML需要序列化节点的元素名(请参阅)。另外,在序列化a
B*
但试图反序列化为a*(虽然这不是编译时问题)时出现了不一致,似乎是因为虚拟类,如果我注释虚拟解构器并使用静态转换而不是动态转换,错误会再次出现!那么,我所有的类都应该是虚拟的吗?为什么?这不是很荒谬吗?@sinaTavakoli一点也不荒谬。读取错误消息很重要。这几乎不是同一个错误。而且,您的原始代码甚至没有
dynamic\u cast
。这是我添加的内容,以更清楚地说明
myA
序列化仍然可以作为动态
B
实例正确地反序列化。好的,那么就决定了,我将使用虚拟多态性并省去麻烦,谢谢你的时间伙伴;)今天我了解到:如果MSVC给出一个
错误C4308
顶级错误,这很可能表明在模板实例化中触发了
BOOST\u STATIC\u警告。
    BOOST_STATIC_WARNING(boost::is_polymorphic< T >::value);
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <iostream>
#include <fstream>
#include <boost/serialization/string.hpp>
#include <string>

class A {
    friend class boost::serialization::access;

  public:
    std::string a;
    virtual ~A() {}

  private:
    template <class Archive>
    void serialize(Archive &archive, const unsigned int version)
    {
        archive &BOOST_SERIALIZATION_NVP(a);
    }
};

class B : public A {
    friend class boost::serialization::access;

  public:
    std::string b;

  private:
    template <class Archive>
    void serialize(Archive &archive, const unsigned int version)
    {
        using namespace boost::serialization;
        archive &make_nvp("base", base_object<A>(*this));
        archive &BOOST_SERIALIZATION_NVP(b);
    }
};

BOOST_CLASS_EXPORT(B)

void save()
{
    std::ofstream file("archive.xml", std::ios::binary);
    boost::archive::xml_oarchive oa(file);
    B *myB = new B();
    myB->a = "1";
    myB->b = "2";

    A* myA = myB;
    oa << boost::serialization::make_nvp("myA", myA);
    delete myB;
    file.close();
}

void load()
{
    std::ifstream file("archive.xml", std::ios::binary);
    boost::archive::xml_iarchive ia(file);
    A *myA;

    ia >> boost::serialization::make_nvp("myA", myA);

    std::cout << "a: " << myA->a << std::endl;
    if (B* myB = dynamic_cast<B*>(myA))
        std::cout << "b: " << myB->b << std::endl;
}

int main()
{
    save();
    load();
}
    std::cout << "a: " << myA->a << std::endl;
    if (B* myB = dynamic_cast<B*>(myA))
        std::cout << "b: " << myB->b << std::endl;
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="10">
<myA class_id="1" class_name="B" tracking_level="1" version="0" object_id="_0">
    <base class_id="0" tracking_level="1" version="0" object_id="_1">
        <a>1</a>
    </base>
    <b>2</b>
</myA>