【问题标题】:c++ serialization optionsc++ 序列化选项
【发布时间】:2023-04-05 09:05:01
【问题描述】:

我正在为一个特定的包编写插件的项目中工作。

这个包在它的一个头文件中实现了一个“new”方法,因此,我无法包含<strstream>,因为它也实现了“new”。

软件包 sdk 还包含一个精简的非常旧的 bo​​ost 版本,这意味着我不能使用 boost 序列化类。它是基于 VS2008 的 Qt 构建的,我们(这个项目需要)在 VS2005 中,所以我也不能包含 Qt。

我需要能够从外部运行的应用程序获取数据,通过 TCPIP 发送数据。对我来说,从源中序列化数据并在这些限制下读回数据的最佳方式是什么?

我目前很想创建一个结构,它可以包含所有可能发送的数据,然后将该结构的内存复制到一个字节块中,然后发送过来,但这听起来是个坏方法对我来说。

谢谢, 利隆

【问题讨论】:

  • 尝试包含 。 strstream 可能会被您的编译器弃用
  • 当你说 'implements new' 时,你到底是什么意思?如果需要,您不能将 的使用放在单独的编译单元中吗?
  • social.msdn.microsoft.com/forums/en-US/vclanguage/thread/… 我遇到了这个问题,但是“新”实现在我们试图为其创建插件的应用程序的 sdk 中,所以我无法删除它。

标签: c++ qt serialization boost


【解决方案1】:

您可以从数据中提取字节并将其传递,请参阅一个基本示例。

QByteArray vectorToBin(const QVector<qint32> & vec)
{
    size_t size = sizeof(qint16);
    QByteArray result;
    foreach(qint16 e, vec) {
        for(int n = 0; n<=(size-1)*8; n+=8) {
            char c = static_cast<char>((e >> n));
            result.append(c);
        }
    }
    return result;
}

QVector<qint32> binToVector(const QByteArray & bytes)
{
    QVector<qint32> result;
    size_t size = sizeof(qint16);
    for(int i=0; i<bytes.size(); i+=size) {
        qint16 e = ((bytes[i+1] & 0xff)<<8) | (bytes[i] & 0xff);
        result << e;
    }
    return result;
} 

【讨论】:

  • 这样 foreach 将遍历我想要序列化的任何随机类的所有字节?
  • @LKIM 没有 foreach 迭代容器,这只是一个示例。您需要做的是对于给定的对象,获取每个属性的所有字节并安装一个字节数组。对于属性的 n = 0, 8, 16 ... sizeof,您可以移动 n 次原始类型。对对象而不是原始类型的属性重复该过程。请注意,这是一个漫长的过程,最好的方法是使用 strstream 或其他序列化库。
【解决方案2】:

boost.serialization 是去这里的方式。它是我所知道的最易理解的 C++ 序列化库,并且支持标准容器。

【讨论】:

  • 我自己很喜欢并使用 Boost,但它的序列化库只是一场灾难。
  • 很遗憾,boost 不是我们的选择,因为我们使用的 SDK 已经包含了不包含序列化的旧版本的 boost。
  • @LKIM:你总是可以在一个项目中使用两个 Boost 库,只需使用静态链接就可以了。
  • 在这种情况下不是。我们已经在静态链接他们的 SDK,其中包括旧的 bo​​ost。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2011-03-04
    相关资源
    最近更新 更多