C++ Can';t得到C++;Boost指针序列化开始工作

C++ Can';t得到C++;Boost指针序列化开始工作,c++,serialization,boost,C++,Serialization,Boost,此问题与列为重复问题的问题不同: 我没有使用shared_ptr,我可以完全访问我的类的内部 我能找到的最接近的响应是通过搜索编译器错误找到的 然而,那里给出的答案并不清楚,至少对我来说不清楚。它指向boost文档,这表明我在这里列出的简单代码应该可以工作。在通过指针对序列化对象的所有内务处理进行编目之后,boost文档这样说 此序列化库解决了上述所有问题 如果我必须一次写一个char[],一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为它们的组成部分,首先将它们的大小(以字节

此问题与列为重复问题的问题不同: 我没有使用shared_ptr,我可以完全访问我的类的内部

我能找到的最接近的响应是通过搜索编译器错误找到的

然而,那里给出的答案并不清楚,至少对我来说不清楚。它指向boost文档,这表明我在这里列出的简单代码应该可以工作。在通过指针对序列化对象的所有内务处理进行编目之后,boost文档这样说

此序列化库解决了上述所有问题

如果我必须一次写一个char[],一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为它们的组成部分,首先将它们的大小(以字节为单位)写入流,以便使用boost进行序列化,那么使用boost似乎没有多大意义。这是工作中最大的一部分。创建一个文本输出流并向其中喷射字节是很简单的

我并不是说我可能对文档的阅读理解有问题,但是从我对所读内容的理解来看,下面的代码片段应该可以工作。但是,此代码会发出以下编译器错误。所以,我一定遗漏了什么,但我就是看不到,所以我请求帮助

在下面的代码片段中简单地指出失败点如何?或者,更好的是,提供一个有用的代码片段

/usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::ptr_vector<std::basic_string<char> >’ has no member named ‘serialize’
         t.serialize(ar, file_version);
         ^
/usr/include/boost/serialization/access.hpp:118:9:错误:“class boost::ptr_vector”没有名为“serialize”的成员
t、 序列化(ar、文件版本);
^
#包括
#包括
#包括
甲级{
公众:
A(){}
字符c;
字符*名称;
friend boost::serialization::access;
模板
无效序列化(存档和存档,未签名版本)
{
ar&name;
}
};
main()
{
A A;
a、 name=(char*)“这是一个测试”;
std::ofs流(“table.txt”);
boost::archive::text\u oarchive操作系统(ofs);
操作系统
如果我必须一次写一个char[],一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为它们的组成部分,首先将它们的大小(以字节为单位)写入流,以便使用boost进行序列化,那么使用boost似乎没有多大意义

是的。但是您正在尝试序列化一个指针。指向
char
的指针应该序列化为什么?当然
T*
应该序列化一个动态分配的
T
,否?所以您希望序列化一个
char
,除非
name
nullptr

或者,您希望对序列化的每个角色进行完整的对象跟踪吗

这里的要点是,你选择了一个原始指针到原始类型。指针缺少必要的信息。因此,你需要添加OnU。如果你觉得冗长,你可以自由使用C++类型。 顺便说一下,这在C++03及以上版本中是不合法的:

a.name = (char *)"this is a test";
char const(&)[15]
char*
的静态强制转换将删除一个const限定。您的编译器无论如何都应该拒绝此代码

以下是我对它的看法(使用
std::string
):

#包括
#包括
甲级{
公众:
std::字符串名;
模板无效序列化(存档(&R),未签名){
ar&name;
}
};
int main(){
A{“这是一个测试”};
boost::archive::text\u oarchive操作系统(std::cout);

os@Mr.Kbok我也这么做了。\@OP这看起来像HTML吗?你能“运行代码段”吗?你能提供原始答案的链接吗?我找不到。它打印在顶部:如果之前显示页面时出现某种错误,也许你必须刷新浏览器。哦,好吧。答案在链接副本中-如果你查找的话。我在这里写了一个答案。我同意“替代案例”在那个答案中做得不是特别好,但话说回来,不管怎样,没有人应该建议这样做,原因在我的答案.Re中有说明。“在下面的代码片段中简单地指出失败点如何?或者,更好的是,提供一个确实有效的代码片段?”-你是否意识到人们可能没有时间?我向你指出了现有的答案,假设你阅读了它的意思,希望你能感激提前4小时得到答案。你无权得到答案。我只是想帮你。谢谢你深思熟虑的回答。所以,我想简短的答案是为了避免意甲联赛使用指向对象的指针进行序列化。序列化指向类的指针向量,例如“vector”会带来同样的复杂情况,其中“vector”是开箱即用的。我试图解决的问题是与收集大量信息以供以后分析的C代码接口。我必须使用C进行数据收集,因为它使用头不会在C++中编译。
应该会有帮助。而且无论如何,你不能在C模式下使用Boost序列化。如果你还想反序列化,你仍然需要考虑如何分配内存。我认为Boost序列化将是存储数据的一种好方法,它非常复杂,具有嵌套层次结构和图形的属性。如果不是这样的话数据的性质,我只会使用fPrimff(),并用它来做。):Trimdod。我有两个C和C++源共享的头文件中的IFIFF和CPLUS加上外部C。
#include <boost/serialization/string.hpp>
#include <boost/archive/text_oarchive.hpp>

class A {
  public:
    std::string name;
    template <class Archive> void serialize(Archive &ar, unsigned) {
        ar & name;
    }
};

int main() {
    A a { "this is a test" };
    boost::archive::text_oarchive os(std::cout);
    os << a;
}
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <cstring>
#include <cstdlib>

class A {
  public:
    A(char const* sz = nullptr) : name(sz? strdup(sz) : nullptr) {}
    A(A const&) = delete;
    A& operator=(A const&) = delete;

    ~A() { free(name); }

  private:
    char* name;

    template <class Archive> void save(Archive &ar, unsigned) const {
        bool have_name = name;
        ar & have_name;

        if (have_name)
        {
            size_t len = strlen(name);
            ar & len;
            ar & boost::serialization::make_binary_object(name, len);
        }
    }

    template <class Archive> void load(Archive &ar, unsigned) {
        bool have_name = name;
        ar & have_name;

        if (!have_name)
        {
            free(name);
            name = nullptr;
        } else
        {
            size_t len = 0;
            ar & len;

            name = static_cast<char*>(realloc(name, len));
            ar & boost::serialization::make_binary_object(name, len);
        }
    }

    friend class boost::serialization::access;
    BOOST_SERIALIZATION_SPLIT_MEMBER()
};


int main() {
    A a { "this is a test" };
    boost::archive::text_oarchive os(std::cout);
    os << a;
}