将类的序列化放入DLL中

2024-02-06

我正在寻找一个(工作)示例,用于在 DLL 中外部序列化类结构。目前我找不到任何例子。 Boost 文档只是说明一些宏,论坛和新闻组只是讨论具体问题及其解决方案。

所以我要求提供一个(外部)序列化类结构的示例,如下所示。除了类代码之外,我还添加了一些用于序列化的代码(这不起作用,请参阅底部的错误消息)。

class Foo
{
public:
    Foo() { number_ = 0; }
    virtual ~Foo() {}

    int getNumber() { return number_; }
    void setNumber( int var ) { number_ = var; }
private:
    int number_;
};

class Bar : public Foo
{
public:
    Bar() { doubleNumber_ = 0.0; }
    virtual ~Bar() {}

    double getDouble() { return doubleNumber_; }
    void setDouble( double var ) { doubleNumber_ = var; }

private:
    double doubleNumber_;
};

到目前为止我所得到的都是这样的代码:

序列化Foo.h

#ifndef _SERIALIZE_FOO_H_
#define _SERIALIZE_FOO_H_

#include "Foo.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>

namespace boost {
namespace serialization {

template <typename Archive>
void save(Archive& ar, const Foo& object, const unsigned int version)
{
    ar << object.getNumber();
}

template <typename Archive>
void load(Archive& ar, Foo& object, const unsigned int version)
{
    int number;
    ar >> number;
    object.setNumber(number);
}

}} //namespace brackets

BOOST_SERIALIZATION_SPLIT_FREE( Foo )

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY( Foo )

#endif //_SERIALIZE_FOO_H_

序列化Foo.cpp

#include "serializeFoo.h"
BOOST_CLASS_EXPORT_IMPLEMENT( Foo )

序列化Bar.h:

#ifndef _SERIALIZE_BAR_H_
#define _SERIALIZE_BAR_H_

#include "Bar.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>

namespace boost {
namespace serialization {

template <typename Archive>
void save(Archive& ar, const Bar& object, const unsigned int version)
{
    ar << base_object<Foo>(object);
    ar << object.getDouble();
}

template <typename Archive>
void load(Archive& ar, Bar& object, const unsigned int version)
{
    double doubleNumber;
    ar >> doubleNumber;
    object.setDouble(doubleNumber);
}

}} //namespace brackets

BOOST_SERIALIZATION_SPLIT_FREE( Bar )

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY( Bar )

#endif //_SERIALIZE_BAR_H_

序列化Bar.cpp:

#include "serializeBar.h"
BOOST_CLASS_EXPORT_IMPLEMENT( Bar )

序列化代码进入 DLL,并应在另一个使用类 Foo 和 Bar 的项目中使用。一切都编译良好,但在运行时我收到消息
unregistered class - derived class not registered or exported

那么我是否使用了错误的宏?我错过了宏吗?上面的代码正确还是存在某种结构错误?也许这对很多其他人也有用,我不认为将类的序列化放入 DLL 中是非常奇特的......


我最近遇到了类似的问题,距这个问题提出三年后。我终于找到了解决该问题的解决方法。在上面的例子中。

  • Bar是一个子类Foo,所以必须注册/导出;
  • serializeFoo.cpp实例化一个 GUID 模板类来注册/导出Foo;
  • serializeBar.cpp实例化一个 GUID 模板类来注册/导出Bar;
  • 遵守在导出类密钥之前包含所有必要的存档类型的规则;
  • 两个翻译单元链接在一起以创建 DLL。

我假设在你的exe中,当你试图序列化一个Foo*指针指向一个Bar对象,您收到“未注册的类 blahblah”错误。这是因为 Boost.Serialization 无法正确生成类的 GUIDBar before调用序列化函数。

我不知道为什么会发生这种情况,但似乎 GUID 是以一种惰性方式生成的 - 如果没有来自翻译单元的符号serializeBar.cpp使用时,不会执行该翻译单元中定义的任何实例化/初始化代码——其中包括类注册/导出Bar.

为了证明这一点,您可以尝试在中使用(虚拟)符号serializeBar.cpp(例如,通过调用在中实现的虚拟函数serializeBar.cpp)在调用任何序列化函数之前Foo*。这个问题应该消失。

希望能帮助到你。

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

将类的序列化放入DLL中 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的

随机推荐

  • 实体框架异常“底层提供程序在打开时失败”

    我创建了一个 Windows 服务 它侦听 TCP IP 端口并使用实体框架将接收到的数据保存在数据库中 大多数时候它工作正常 但有时会抛出异常 底层提供程序打开失败 在数据库中保存数据 这是我的异常详细信息 Exception 2 27
  • 如何在tf.data.Dataset.map()中使用Keras的predict_on_batch?

    我想找到一种使用 Keras 的方法predict on batch inside tf data Dataset map in TF2 0 假设我有一个 numpy 数据集 n data 10 5 my data np random ra
  • Ajax推送系统

    在我自己的系统中 我有一个PHP页面显示我通过在线网上商店出售的所有商品 从最新交易到第一笔交易 我希望每当人们从我这里购买东西时 此页面就会自动更新 我可以做AJAX打电话给每个5几秒钟来检查我数据库中的订单 但这似乎是 1980 年 或
  • 在 Windows 10 分配的访问权限中运行 Chrome kiosk 模式

    好消息是Windows 10分配访问支持运行桌面应用程序 Win 8 1仅支持运行通用应用程序 我想在命令行中使用 kiosk 运行 Chrome 的 kiosk 模式 本文底部有教程 https technet microsoft com
  • 处理单例实例 (C#)

    如果单例实现了 IDisposable 那么处置和重新创建实例的正确方法是什么 一种方法是保留 dispose 标志并在 Instance 属性中检查它 但我不确定这是执行此操作的正确方法 一个简单的例子 public sealed cla
  • 盲目地用代替可以吗?

    Note I know b 是展示性的并且 span style font weight none span b
  • 在 Mac OSX 下检测连接的 USB 设备

    首先声明 对于 Mac 编程 我是一个新手 然而 我有一项任务需要与设备进行 USB 通信 所以我想我将从基本的东西开始 我从here https developer apple com library mac samplecode USB
  • 如何在 moment.js 中获取月份的简称?

    我已成功找到月份的全名 但我想要月份的简称 谁能帮我 我正在使用 Moment js 我已成功找到月份 但我想要简短的形式这是我的代码 var date var Month moment date YYY MM DD format DD M
  • 在 magento 前端显示缺货状态

    我需要在产品页面 前端 上显示当前商品仅用于延期交货 并且没有库存 目前 我的库存显示了可用数量 而缺货的产品则没有显示任何内容 有谁知道我可以在 view phtml 文件中放入一个代码 该代码只会在那些设置为缺货的产品上显示一条消息 T
  • 我应该使用 Java 中的哪个线程池?

    有大量的任务 每个任务都属于一个组 要求是每组任务应该像在单线程中执行一样串行执行 并且在多核 或多CPU 环境中吞吐量应该最大化 注意 组的数量也与任务数量成正比 最简单的解决方案是使用 ThreadPoolExecutor 并同步 或锁
  • sklearn:关闭警告

    当我适合的时候sklearn s LogisticRegression使用 1 列 pythonpandas DataFrame not a Series对象 我收到此警告 Library Python 2 7 site packages
  • 设置一个二维数组,稍后更改大小 - C

    是否可以在 C 中声明一个二维数组 然后再设置其大小 我知道在 C 中你必须处理内存等问题 但尽管我进行了所有搜索 但我找不到这个问题的答案 我当前的例子是 int boardsize linewin char array 1 1 boar
  • .xib 中的 UITableView 没有内容属性

    XCode 4 2 iOS 5 为了重用表格视图 带有导航栏和编辑 添加按钮 我创建了一个UITableViewController拥有自己的子类 xib 但是 当我添加一个UITableView to my xib的主视图内容属性 我想将
  • 如何为单个 If 语句执行多个条件

    我试图在 vbscript 中的单个 If 语句上执行两个条件 应该很简单 但它不起作用 就像是 If Not fileName testFileName fileName lt gt Then Else 我用两个 if 语句来让它工作 但
  • 使CPU的缓存失效

    当我的程序执行具有获取语义的加载操作 具有释放语义的存储操作或可能是完整栅栏时 它会使 CPU 的缓存无效 我的问题是 缓存的哪一部分实际上失效了 只有保存我使用的获取 释放变量的缓存行 或者整个缓存都失效了 L1 L2 L3 等等 当我使
  • 将 Office365 REST 日历 ID 映射到 EWS 日历项目 ID

    使用交换推送通知 https msdn microsoft com en us library aa566188 v exchg 80 aspx我一直在创建一项同步 Office365 用户的日历数据的服务 我一直在使用以下组合Office
  • 如何在 MYSQL 中获取主管姓名而不是 UserID + INNER JOIN

    这是我的表格 从用户中选择 USERID NAME STATUS 1 AAA Member 2 BBB Member 3 CCC Supervisor 4 DDD Member 5 EEE Member 从出席中选择 NO DATE SUP
  • 在自定义行为上绑定依赖属性时出错

    我正在探索 Silverlight 附加行为机制 以便在我的 Silverlight 应用程序中使用模型 视图 视图模型模式 首先 我试图让一个简单的 Hello World 工作 但我完全陷入了一个错误 无法找到解决方案 我现在拥有的是一
  • 如何计算图像是横向还是纵向

    我正在使用 jquery 创建一个图片库 有没有可能使用jquery计算图像是横向还是纵向 感谢您的支持 您可以简单地比较图像的宽度和高度 var someImg someId if someImg width gt someImg hei
  • 将类的序列化放入DLL中

    我正在寻找一个 工作 示例 用于在 DLL 中外部序列化类结构 目前我找不到任何例子 Boost 文档只是说明一些宏 论坛和新闻组只是讨论具体问题及其解决方案 所以我要求提供一个 外部 序列化类结构的示例 如下所示 除了类代码之外 我还添加
Powered by Hwhale