Boost:序列化/反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

2023-12-21

描述:

我有一个名为的 C++ 类通用消息它仅保存一个 id 和数据作为其成员(请参阅下面的代码片段 1 - GenericMessage.hxx)。我的目的是序列化此类的实例并通过实现推送模式的 ZeroMQ 套接字发送它。

序列化和发送任务已实现类 ZMQHandler(参见sendToBE函数)它被放置在一个名为ZMQHandler.hxx的头文件中,如图所示代码片段2以下。该类的实例化为测试FE.cxx显示在第三个代码片段 below.

GenericMessage实例的接收和反序列化实现在测试BE.cxx可用在第四个代码片段以下。我的目的是通过 ZMQ 套接字(即拉套接字)接收 GenericMessage 实例,对其进行反序列化,然后打印其成员。

Problem:

问题是,当我编译 TestBE.cxx 时,出现许多涉及模板函数的编译错误。考虑到 TestBE.cxx 中的代码,谁能告诉我在第四个代码片段中标有注释的反序列化部分中缺少什么?我是一个相对较新的 C++ 程序员,想知道如何解释这些与模板函数相关的编译错误,这些错误已列在本文底部(即最终片段)。第 18 行是编译错误发生的地方,在第 4 个代码片段中进行了标记。谢谢。

代码片段 1 (GenericMessage.hxx)

#include <iostream>
#include <string>
#include <sstream>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

template <class T>
class GenericMessage {
public:
      GenericMessage(): 
      beId(-1), data(NULL)
      {}

      GenericMessage(int id, T msg): beId(id), data(msg)
      {}

     ~GenericMessage(){}

     T getData()
     {
       return data;
     }


     std::string toString()
     {
        std::ostringstream ss;
        ss << getBeId();
        std::string ret =  ss.str();

        return ret;
      }

      void setBeId(int id)
      {
        beId = id;
      }

      int getBeId()
      {
        return beId;
      }


      private:
            friend class boost::serialization::access;

            int beId;
            T data;

            template <class Archieve>
            void serialize(Archieve & ar, const unsigned int version)
            {
               ar & beId;
               ar & data;
            }

 };

代码片段 2 (ZMQHandler.hxx)

 #include "zmq.hpp"
 #include "GenericMessage.hxx"
 #include <pthread.h>
 #include <unistd.h>
 #include <cassert>

template <class A>
class ZmqHandler {
public:

       ZmqHandler():
   mContext(1),
   mOutbHandlerSocket(mContext, ZMQ_PUSH)
       {    
            mOutbHandlerSocket.bind ("tcp://*:5555");       
       }

       ~ZmqHandler() {}

        void sendToBE(GenericMessage<A> &theMsg)
        {
           std::stringstream ss(std::ios_base::binary| std::ios_base::out|  std::ios_base::in);
           boost::archive::binary_oarchive oa(ss, boost::archive::no_header);
           oa << theMsg;

           zmq::message_t msgToSend(sizeof(ss));

           memcpy(msgToSend.data(), ss.str().data(), ss.str().length());
           if(memcmp(msgToSend.data(), ss.str().data(), ss.str().length()) != 0)
           {
               printf("memcpy error\n");
           }

           mOutbHandlerSocket.send(msgToSend);
           std::cout << "SENT request: [" << theMsg.toString() << "]" << std::endl;
}   

    private:  
          zmq::context_t mContext;
          zmq::socket_t mOutbHandlerSocket;         
};

代码片段 3 (TestFE.cxx)

 #include "ZmqHandler.hxx"

 int main ()
 {
   ZmqHandler<std::string> zmqHandler;
   int counter = 1;

   while(1)
   {  
     std::string data = "Hello there!\0";
     GenericMessage<std::string> msg(counter, data);
     zmqHandler.sendToBE(msg);
     counter++;
     sleep(1);
    }

    return 0;
 }     

代码片段 4 (TestBE.cxx)

 #include "zmq.hpp"
 #include "GenericMessage.hxx"
 #include <fstream>

 int main ()
 {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PULL);

   std::cout << "Connecting to FE..." << std::endl;
   socket.connect ("tcp://localhost:5555");

   while(1){
       zmq::message_t reply;
       socket.recv (&reply);

       /* !!!!!!! LINE 18 starts HERE !!!!!!! */
       std::stringstream is(reply.data(), std::ios_base::binary| std::ios_base::out| std::ios_base::in);
       boost::archive::binary_iarchive ia(is, boost::archive::no_header);

       GenericMessage<std::string> msg;
       ia >> msg;

       std::cout << "RECEIVED: " << msg.toString() << std::endl;
       std::cout << "DATA: " << ((std::string)msg.getData())  << std::endl;
    }

     return 0;
 }

TestBE.cxx 的编译输出

 g++ -g -c TestBE.cxx GenericMessage.hxx
 TestBE.cxx: In function ‘int main()’:
 TestBE.cxx:18:104: error: invalid user-defined conversion from ‘void*’ to ‘const  __string_type& {aka const std::basic_string<char>&}’ [-fpermissive]
       In file included from /usr/include/c++/4.7/string:55:0,
             from /usr/include/c++/4.7/bits/locale_classes.h:42,
             from /usr/include/c++/4.7/bits/ios_base.h:43,
             from /usr/include/c++/4.7/ios:43,
             from /usr/include/c++/4.7/ostream:40,
             from /usr/include/c++/4.7/iostream:40,
             from GenericMessage.hxx:1,
             from TestBE.cxx:2:
  /usr/include/c++/4.7/bits/basic_string.tcc:214:5: note: candidate is:     std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&)  [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>] <near  match>
  /usr/include/c++/4.7/bits/basic_string.tcc:214:5: note:   no known conversion for argument 1 from ‘void*’ to ‘const char*’
  TestBE.cxx:18:104: error: invalid conversion from ‘void*’ to ‘const char*’ [-fpermissive]
       In file included from /usr/include/c++/4.7/string:55:0,
             from /usr/include/c++/4.7/bits/locale_classes.h:42,
             from /usr/include/c++/4.7/bits/ios_base.h:43,
             from /usr/include/c++/4.7/ios:43,
             from /usr/include/c++/4.7/ostream:40,
             from /usr/include/c++/4.7/iostream:40,
             from GenericMessage.hxx:1,
             from TestBE.cxx:2:
       /usr/include/c++/4.7/bits/basic_string.tcc:214:5: error:   initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ [-fpermissive]
       make: *** [TestBE.o] Error 1

我想说错误消息非常清楚:字符串流的构造函数 http://www.cplusplus.com/reference/sstream/stringstream/stringstream/需要任一类型openmode or std::string,并且您传递了一个类型的参数void*(返回reply.data()).

您可以将收到的消息转储到二进制文件中,但您仍然需要进行一些转换。

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

Boost:序列化/反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • 登录 Clojure

    对于Java开发 我使用Slf4j和Logback Logger logger LoggerFactory getLogger HelloWorld class logger debug Hello world 如何在 Clojure 程序
  • 使用 GDI+ 旋转图像而不剪裁其边缘的最快方法是什么?

    有一些非常漫长且饥饿的算法可以做到这一点 但到目前为止我还没有想出或发现任何特别快的算法 最快的方法是使用不安全调用直接操作图像内存LockBits 听起来很可怕 但其实很简单 如果您搜索 LockBits 您会发现大量示例 例如here
  • DevPay和Mfa是互斥的授权方式

    我尝试使用以下命令通过 AWS cli 将 MFA 删除添加到我的 S3 存储桶 aws s3api put bucket versioning bucket
  • 2D 软体:凝胶状和可塑性?

    我正在使用 Matter js 物理学来尝试创建软体 我能够创建这样的身体 但我不确定这是否是我想要的 软体 确实 这个物体并不完全是刚性的 并且在碰撞和被拖动时具有弹性的感觉 我一直在寻找与凝胶有相似之处的身体 这张图片可能在视觉上有助于
  • Pandas 分割错误

    由于内存不足 以下代码行未成功执行 import pandas as pd import datetime as dt u cols remote host dummy1 dummy2 date timezone get status by
  • PDO 错误:一般错误:2031 [重复]

    这个问题在这里已经有答案了 当我执行代码时出现此错误 我知道这已经在这里讨论过几次了 但我无法通过阅读那里提供的解决方案来解决我的问题 这是我得到的错误 致命错误 未捕获异常 PDOException 消息为 SQLSTATE HY000
  • 对于软件开发人员来说,学习如何对微控制器进行编程有多难?

    我是一名软件开发人员 我使用高级语言进行编程已有几年了 我想知道如何迈出硬件编程的第一步 不是什么疯狂复杂的东西 但也许是一些普通的 CE 设备 假设我不需要将 PCB 与各种组件放在一起 而只是对微型 cpu 进行编程 我要到多低的级别
  • 该算法的复杂度(Big-O)是多少?

    我对算法分析相当熟悉 并且可以说出我使用的大多数算法的大体 但我已经被困了几个小时 无法为我编写的这段代码想出 Big O 基本上 它是一种生成字符串排列的方法 它的工作原理是使字符串中的每个字符成为第一个字符 并将其与子字符串减去该字符的
  • 我可以在摘要式身份验证中使用已 MD5 编码的密码吗

    我在数据库中有密码的 MD5 哈希值 我想将其用于 HTTP AUTH DIGEST 但在阅读文档时 摘要哈希看起来包含用户名 领域和明文密码的哈希 在这种情况下有什么办法可以使用密码的 MD5 哈希吗 不 如果他们需要的哈希是这样生成的
  • Spark 结构化流:多个接收器

    我们使用结构化流从 Kafka 进行消费 并将处理后的数据集写入 s3 我们还想将处理后的数据写入 Kafka 是否可以通过同一个流查询来完成此操作 火花版本2 1 1 在日志中 我看到流式查询进度输出 并且我有来自日志的示例持续时间 JS
  • 分割字符串后将值插入表中

    我想将值插入员工表中 这些值是字符串格式的 分开 E g AA B 123 我使用以下函数分割它 CREATE FUNCTION db owner FN Split String varchar 8000 Delimiter char 1
  • 在异步方法中使用反射获取方法名称不会返回预期结果

    以下是我编写的一小段代码 用于演示此问题的基础知识 Code private async void Form1 Load object sender EventArgs e var result await TestAsyncMethodN
  • 查找鼠标相对于面板的位置

    我试图获取鼠标在面板中的位置 如面板左上角 x y 0 0 我目前所拥有的给出了整个屏幕上的位置 因此根据面板 位于框架中 在屏幕上的位置 坐标是不同的 我想你可以添加 x y 坐标来解决这个问题 但这似乎是一个混乱的解决方案 有人可以帮忙
  • 错误的身份验证数据 QuickBlox - Android

    我正在研究QuickBlox SDK http quickblox com developers SimpleSample users android Sign In 26 Social authorization 使用这个 SDK 我尝试
  • 可以使用 boost::threads 中的 std::this_thread* 函数吗?

    可以混合搭配来自的东西吗 boost thread and std thread 或者应该为每个函数使用一组函数 我问是因为我的代码使用boost threads 但我发现boost this thread sleep for设置系统时间时
  • 如何检查远程 git 存储库 URL 的有效性?

    在 bash 脚本中 验证 git URL 是否指向有效的 git 存储库以及脚本是否有权读取它的最简单方法是什么 应该支持的协议有git https and git 卷曲失败git 协议 email protected cdn cgi l
  • 如何导致 ldap_simple_bind_s 超时?

    最近 我们的测试 LDAP 服务器遇到了问题 它挂起并且无法响应请求 结果 我们的应用程序在尝试绑定时永远挂起 这仅发生在 Unix 机器上 在 Windows 上 ldap simple bind s大约 30 秒后呼叫超时 我不知道是不
  • 将 UTF-8 文本转换为 wchar_t

    我知道这个问题已经被问过很多次了 我确实阅读了一些答案 但是有一些建议的解决方案 我试图找出其中最好的解决方案 我正在编写一个 C99 应用程序 它基本上接收以 UTF 8 编码的 XML 文本 它的部分工作是复制和操作该字符串 查找子字符
  • 从因子变量中删除特定因子水平

    我有一个数据框 其中包含多个具有 5 个因子水平的变量 我只想删除其中一个级别 首先 我将该级别的所有实例分配给 NA 然后使用droplevels命令摆脱空的水平 然而 对于我的数据框中的一个变量 我不想删除的级别之一没有任何观察结果 有
  • Boost:序列化/反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

    描述 我有一个名为的 C 类通用消息它仅保存一个 id 和数据作为其成员 请参阅下面的代码片段 1 GenericMessage hxx 我的目的是序列化此类的实例并通过实现推送模式的 ZeroMQ 套接字发送它 序列化和发送任务已实现类