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

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(使用前将#替换为@)

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

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 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