通过指向派生类的基指针增强序列化[重复]

2023-11-30

可能的重复:
使用多态档案增强序列化

我试图使用指向派生类的基指针来序列化我的类,但这仅序列化基类。

我刚刚读过http://www.boost.org/doc/libs/1_32_0/libs/serialization/doc/special.html#registration,但是导出宏和寄存器函数似乎都没有改变任何东西。

考虑以下非常基本的类层次结构:

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>

class A
{
private:
  friend class boost::serialization::access;
  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  { 
    std::cout << "A!\n";
  }
};

class B : public A
{
private:
  friend class boost::serialization::access;
  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  {
    ar & boost::serialization::base_object<A>(*this);
    std::cout << "B!\n";
  }
};

int main()
{
  std::ofstream of("mybin.bin");
  boost::archive::binary_oarchive oa(of);

  A* b = new B();
  oa << b;

  delete b;

  return 0;
}

输出将是:

A!

显然,我正在寻找的输出是 A!乙!有什么办法可以实现这一点吗?

EDIT:好吧,看了评论里的相关条目,事情是这样的。

有 3 件事需要改变:

  1. A类应该有一个虚函数,这样它就被认为是多态的
  2. 需要导出派生类。 BOOST_CLASS_EXPORT(B)
  3. oa

它与标准的binary_oarchive以及polymorphic_binary_oarchive一起使用。

EDIT2:当我有 b.cpp(.h) 和 main.cpp 时,BOOST_CLASS_EXPORT 会导致重复的符号:

重复符号 boost::archive::detail::extra_detail::init_guid::g


我必须承认我对此并不熟悉boost包,但我复制并编译了代码,产生了与提到的OP相同的结果

意识到我们正在使用多态性,我添加了一个public: virtual ~A(){}; in class A. Also, oa.register_type<B>();添加到main根据该文件,输出变为:

A!
B!

根据规范,一个类是一个polymorphic class只有当declares or inherits a virtual function。对于非多态类,也许多态性不起作用。

EDIT:

BOOST_CLASS_EXPORT(B); in B.cpp代替B.h似乎可以解决这个重新定义的问题。

EDIT:

检查了扩展结果BOOST_CLASS_EXPORT(B)(重新格式化):

namespace boost {
    namespace serialization {
        template<> struct guid_defined<B> : boost::mpl::true_ {};
        template<> inline const char * guid<B>(){ return "B"; }
    }
}
namespace boost {
    namespace archive {
        namespace detail {
            namespace { // NOTE
                template<> struct init_guid< B > {
                    static guid_initializer< B > const & g;
                };
                guid_initializer< B > const & init_guid< B >::g = ::boost::serialization::singleton< guid_initializer< B > >::get_mutable_instance().export_guid();
            }
        }
    }
}

对于标有的行NOTE:对于boost 1.42,使用的是匿名命名空间,如果将其放入多个cpp文件或放入头文件中,则没有问题(在ubuntu中使用g++进行测试,使用Ubuntu附带的boost包)。然而,在boost 1.48中,namespace extra_detail使用,当放入多个cpp文件时会出现问题(在VS2010的windows中测试,使用从主页下载的boost)。

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

通过指向派生类的基指针增强序列化[重复] 的相关文章

  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • 最新 .Net MongoDb.Driver 的连接问题

    我创建了一个 MongoLab 沙箱数据库 我与 MongoChef 连接 效果很好 我通过 Nuget 安装了 MongoDB Driver 2 2 2 我编写了一些简单的 C 演示代码 但就是无法使其工作 连接字符串是直接从 Mongo
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • Dapper 在执行时挂起

    我有一个 IDb连接 sql UPDATE 表名 SET json json lastupdate SYSDATE WHERE id id var param new DynamicParameters param Add json jso
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • .NET 5 EF Core SaveChangesAsync 因错误而挂起

    尽管这个问题有很多结果 但没有一个真正给我明确的答案 每次我尝试通过 AddAsync 和 SaveChangesAsync 方法插入错误数据 例如重复的主键 时 我都会看到以下日志 执行 DbCommand 失败 15 毫秒 我还在 SQ
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • Polymer DomModule 已定义

    我正在构建一个网站 我会在其中使用不同的聚合物组件 其中一些组件会多次使用 我的问题是编译后的代码包含一个 customElements define dom module DomModule 那个抛出 Uncaught DOMExcept
  • 如何使用 Nokogiri 使空标签自动关闭?

    我在 ERB 中创建了一个 XML 模板 我在导出过程中用数据库中的数据填充它 在某些情况下 存在 null 值 在这种情况下元素可能为空 如下所示
  • 在META-INF目录下添加生效的pom.xml

    当我使用 Maven 2 版本2 0 9 or 2 2 1 the pom xml库的内容被复制到META INF maven groupId artifactId JAR 的目录 然而 就我而言 pom xml有父母 我更愿意得到有效的p
  • 如何使用 Spring Web 服务创建自定义肥皂故障消息

    我正在尝试使用 Spring Web 服务库编写一个 Web 服务 我能够成功配置我的端点并且工作正常 但我在异常映射方面遇到了一些问题 我可以使用 SoapFault 和 SoapFaultAnnotationExceptionResol
  • iphone:如何以编程方式检测最后一个来电号码?

    有什么方法可以检测 iPhone 上的最后来电号码和通话时长 我能够获取所有通知 核心电话 但不知道如何获取来电号码 你不能 API 不允许你这样做 我认为出于隐私考虑 苹果永远不会允许这样做
  • 学说实体关系

    我有一个实体模板和另一个请求 本质上 模板代表一个 html 表单 请求将代表表单填充的值的集合以及对模板 ID 的引用 class Request Id Column type integer GeneratedValue private
  • 安卓锁屏

    有没有办法在锁屏上显示文字 喜欢有关未读短信的信息或喜欢锁定屏幕上带有播放 暂停按钮的音乐播放器 Thanks 是的 也不是 他们没有公共 API 来创建或修改锁定屏幕 无论是谁在您的设备上构建了操作系统版本 都创建了您的锁定屏幕 一些制造
  • 如何使用 fastcgi_finish_request() 的示例

    有人可以展示一个关于如何使用的简单示例吗fastcgi finish request 功能 我用谷歌搜索 但只发现了一些一般性的提及 有些人说他们成功地使用了它 但我找不到带有代码的单个示例 例如 我有一个 PHP 对象 为了向浏览器发送响
  • 如何让Javascript忽略或保留空格,而不是删除它们

    我试图让一个函数用破折号覆盖多单词区域 但不用 JavaScript 中的破折号覆盖单词之间的空格 所以 我基本上需要 JS 来忽略空格 或者维护然后 但我在网上找到的只是如何从字符串中删除空格 如果我这样做 那么覆盖该区域的破折号之间仍然
  • jquery遍历查找父级的父级

    HTML li class comment div class p comm div class avatar img src img 1 jpg div div class c auth author a class del title
  • 如何从电子邮件地址中提取“域”

    我的专栏中有以下模式 email protected email protected 现在 我想在之后提取文本 和之前 即 gmail 和 hotmail 我能够在之后提取文本 用下面的代码 sub email 我如何修改上述内容以适合我的
  • 如何在 Marklogic 中构建一个简单的搜索应用程序?

    我想在 Marklogic 中构建一个简单的搜索应用程序 但我不想使用应用程序生成器 我想编写自己的 xqy 文件 我想从用户那里获取名字 姓氏和地址的输入 用户可以按名字 姓氏或地址进行搜索 他还可以通过输入所有三个字段来进行搜索 也可以
  • python 中的哨兵循环

    因此 我从用户那里获取要存储到列表中的输入 并且使用哨兵循环不断要求用户输入数字 出现的问题是 当用户完成输入值后 我使用 停止 结束循环时 出现错误 ValueError 以 10 为基数的 int 的文字无效 停止 我不知道为什么 如果
  • 按键对哈希值进行排序,然后在 Ruby 中返回哈希值

    这是对哈希进行排序并返回哈希对象 而不是数组 的最佳方法吗 h a gt 1 c gt 3 b gt 2 d gt 4 gt a gt 1 c gt 3 b gt 2 d gt 4 Hash h sort gt a gt 1 b gt 2
  • GWT 编译的一些微妙之处 - “gwt 模块可能需要(重新)编译。”

    我正在将应用程序部署到 GAE 我在 Eclipse 中设置了一个项目 其中包含三个独立的 GWT 模块 每个模块都有自己的 HTML 页面 入口点等 它们共享大量代码 当我将应用程序部署到 appengine 时 其中两个模块工作正常 我
  • getstream.io 中的用户身份验证和配置文件

    我想知道是否可以直接使用 getstream io 管理用户配置文件和用户身份验证 我浏览了示例 但不明白用户是如何创建的 目前无法在 Stream 中管理用户帐户 配置文件和身份验证 Stream 最好与处理这些事情和其他功能 应用程序逻
  • OpenCV、Qt、imread、namedWindow、imshow 不起作用

    In the pro file QT core QT gui TARGET latihan 2 CONFIG console CONFIG app bundle TEMPLATE app SOURCES main cpp INCLUDEPA
  • 有人对 Play 框架有什么好的 A/B 测试策略吗?

    我对好的策略感兴趣A B 或拆分测试与 Play 框架 显而易见的选择是使用 Google 网站优化工具 但出于以下几个原因我不想这样做 只允许您测试表示层中的内容 很难根据收入等因素 而不是点击或转化等二元事件 进行测试 不得不用 Jav
  • 在 Click 事件上查找按钮的父 ListViewItem

    我有一个按钮作为每个 ListViewItem 的最后一列 当按下按钮时 我需要在单击事件中找到按钮 发送者 父列表视图项 我努力了 ListViewItem itemToCancel sender as System Windows Co
  • 通过指向派生类的基指针增强序列化[重复]

    这个问题在这里已经有答案了 可能的重复 使用多态档案增强序列化 我试图使用指向派生类的基指针来序列化我的类 但这仅序列化基类 我刚刚读过http www boost org doc libs 1 32 0 libs serializatio