将类的序列化放入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中 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

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

    我创建了一个 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