无法使 C++ Boost 指针序列化工作

2023-12-26

此问题与重复列出的问题不同:Boost C++ 序列化 char * https://stackoverflow.com/questions/5094750/boost-c-serializing-a-char我没有使用shared_ptr,并且我可以完全访问我的类的内部结构。

我能找到的最接近的回应是将指向自定义对象的指针向量存储到文件中 https://stackoverflow.com/questions/12283800/store-a-vector-of-pointers-to-custom-objects-to-file我通过搜索编译器错误发现了这一点。

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

该序列化库解决了上述所有注意事项。

如果我必须一次写入一个 char[] 一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为其组成的 POD 部分,首先将它们的大小以字节为单位写入流中,以便序列化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);
         ^
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class A {
public:
        A(){}

        char c;
        char *name;

        friend boost::serialization::access;
        template<class Archive>

        void serialize(Archive& ar, unsigned version) 
        {
                ar &  name;
        }
};

main()
{
        A a;
        a.name = (char *)"this is a test";

        std::ofstream ofs("table.txt");
        boost::archive::text_oarchive os(ofs);
        os << a;
}

我可以序列化 int、char、甚至 STL 类型,但我无法使用指针序列化任何内容。例如,我可以序列化std::vector<std::string>,但是如果我尝试序列化std::vector<std::string *>,我会得到编译器错误。


如果我必须一次写入一个 char[] 一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为其组成的 POD 部分,首先将它们的大小以字节为单位写入流中,以便序列化boost,那么使用boost似乎没有太大意义。

是的。但是您正在尝试序列化指针。指针应该指向什么char被序列化为?一定T*应该序列化动态分配的T, 不?所以你会期望序列化一个char unless name were nullptr?

或者您是否希望获得序列化的每个角色的完整对象跟踪?

这里的重点是您选择了指向原始类型的原始指针。指针缺少必要的信息。因此,您有责任添加信息。如果你发现tedious,您可以自由地使用 C++ 类型。

顺便请注意,这在 C++03 及更高版本中无论如何都是不合法的:

a.name = (char *)"this is a test";

静态转换来自char const(&)[15] to char *会放弃 const 资格。无论如何,你的编译器应该拒绝这段代码。

这是我的看法(使用std::string):

#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;
}

顺便说一句,链接的重复问题的标题与您在此处尝试执行的操作完全匹配:Boost C++ 序列化 char * https://stackoverflow.com/questions/5094750/boost-c-serializing-a-char并且接受的答案显示完全相同的解决方案。

If you really坚持认为,你当然可以不顾一切地去研究一些 C 风格的代码:

#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;
}

但所有这些给你带来的好处是 6 倍的代码量、残缺的值语义、完全放弃的关注点分离、大量潜在的错误(你有没有想过拥有name==null and strlen(name)==0?目前我的实现采用未指定的(实现定义的)行为 http://en.cppreference.com/w/cpp/memory/c/realloc。我将把它作为练习留给读者,在这里提出密封处理)并且......甚至不可读的字符串输出。

是的当然make_array会给你14 116 104 105 115 32 105 115 32 97 32 116 101 115 116代替dGhpcyBpcyBhIHRlc3Q=,但这存储效率极其低下,而且仍然不可读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使 C++ Boost 指针序列化工作 的相关文章

  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 我可以强制 CloudFormation 删除非空 S3 存储桶吗?

    有没有办法强制 CloudFormation 删除非空 S3 存储桶 您可以创建一个拉姆达函数清理您的存储桶并使用以下命令从 CloudFormation 堆栈调用您的 lambda自定义资源 下面是清理存储桶的 lambda 示例 usr
  • WinForms 窗口在遇到异步调用时会更改尺寸

    我有一个已有几年历史的 WinForms 项目 并且已经使用异步事件处理程序进行了改造 private async void dgvNewOrders CellClick object sender DataGridViewCellEven
  • 强制 Vi/Vim 仅在重新制表时使用前导制表符!

    有没有办法强制vim使用制表符进行初始缩进 但是在运行重新制表符时 命令不使用制表符替换内部字间距 根据我的经验 最好的方法是使用自定义函数 Retab spaced file but only indentation command Re
  • 在Ag-Grid中,当列定义为可编辑时,如何使浮动行不可编辑?

    在AG Grid中 当列定义为可编辑时 如何使浮动行不可编辑 是否可以使用浮动 CellRenderer 来防止浮动行单元格的单元格编辑 floatingCellRenderer function params if params node
  • Rails 中的多个数据库

    这可以做到吗 在单个应用程序中 使用 SQLite 管理多个项目 我想要的是为我的应用程序管理的每个项目都有一个不同的数据库 因此结构相同的数据库的多个副本 但其中包含不同的数据 我将根据 URI 上的参数选择要使用的副本 这样做是为了 1
  • 对对象中的 JavaScript 数组进行排序,维护键

    我有一个带有两个数组的 javascript 对象 如图所示 var Object name Matt Tom Mike rank 34 1 17 我试图按排名 1 2 3 排序 但保留与排名相关的名称 Object name 0 tom
  • PHP 中出现意外的 T_ELSE 错误 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在研究一本 php 书中的示例 并且使用此代码在第 8 行收到错误
  • 在哪些移动平台上,“推送令牌”不是永久的?

    我们都知道 为了在任何移动平台上使用推送通知功能 我们需要一个称为 推送令牌 的唯一标识符 开发人员需要以某种方式将该 令牌 保存到他的服务器上 以便能够向用户发送通知 然而 在哪些移动平台上 这个 令牌 将保持永久 并且在哪些移动平台上可
  • 如何在 Scala 中找到列表中最大值的索引?

    对于 Scala List Int 我可以调用方法 max 来查找最大元素值 如何找到最大元素的索引 这就是我现在正在做的事情 val max list max val index list indexOf max 一种方法是使用索引压缩列
  • 如何使用 Flexbox 将菜单居中[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个二行菜单 我想使用 Flexbox 将其居中 我是 Flexbox 新手 有几个问题 当我在 DreamWeaver CS6
  • 我可以将 Django 模型中的至少一个字段作为要求吗?

    假设我有一个 Person 模型 class Person models Model name models CharField max length 50 email models EmailField telephone models
  • 有没有可以重新格式化 cmake 文件的实用程序

    我有相对复杂的 cmake 文件 我想知道是否有任何实用程序可以重新格式化 cmakeList txt 并美化它以便于阅读 一些简单的技巧就可以完成这项工作 例如缩进 if else endif 部分等等 有这样的工具吗 我使用notepa
  • R中的叠加直方图

    我想根据位置绘制长度直方图 我试图覆盖直方图 其中一个位置的数据是一种颜色 而另一个位置的数据是不同的颜色 这是我到目前为止仅绘制直方图的 R 代码 fasta lt read csv fastadata csv header T nort
  • 逐块迭代加载图像,其中块部分重叠

    尝试处理大型卫星图像 10GB 为了有效地处理图像块 block tile 在每次迭代中被加载到内存中 其示例代码如下 def process image src img dst img band id 1 with rasterio op
  • Swift:通过身份查找数组

    swift 中的 find 函数仅支持查找项相等 我想按身份查找项目 例如 鉴于此设置 class A let first A let last A let absent A let array first last 我希望能够做类似的事情
  • 如何在 SQLite 数据库中存储 JSON 对象

    如何在 SQLite 数据库中存储 JSON 对象 正确的方法是什么 其中一处是 blob 类型列 如果我可以将 JSON 对象转换为字节数组并使用 Fileoutputstream 另一个想法是将文本列存储为字符串 import org
  • dpkg:处理存档时出错(安装 Nodejs 时)

    安装nodejs时出现这个错误 https i stack imgur com JMRiT jpg https i stack imgur com JMRiT jpg https i stack imgur com JMRiT jpg 我正
  • 通过 JupyterLab 的链接在当前工作区中打开笔记本

    我需要使用 降价 链接从另一个笔记本打开一个笔记本 但我不想在另一个浏览器选项卡中打开链接的笔记本 相反 它应该在当前的 JupyterLab 工作区 会话中打开 I tried http localhost 8888 lab tree p
  • 精确匹配字符串

    仅当文本完全匹配时才匹配的正则表达式 如果重要的话 在 JavaScript 中 是什么 也就是说 字符串的另一端不应有多余的字符 例如 如果我想匹配abc then 1abc1 1abc and abc1不会匹配 使用开始和结束分隔符 a
  • 无法使 C++ Boost 指针序列化工作

    此问题与重复列出的问题不同 Boost C 序列化 char https stackoverflow com questions 5094750 boost c serializing a char我没有使用shared ptr 并且我可以