2011-09-22 35 views
0

我正在一个项目中为特定的软件包编写一个插件。C++序列化选项

这个包在其头部实现了一个“新”方法,因此我不能包含<strstream>,因为它也实现了“新”。

包sdk还包含一个稀疏和非常旧的boost版本,这意味着我不能使用boost序列化类。它建立在VS2008的Qt上,我们(这个项目需要)在VS2005中,所以我也不能包含Qt。

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

我目前试图做一个结构,可能包含所有可能的数据可能被发送过来,然后只是将该结构的内存复制到一个字节块被发送过来,但这听起来像一个坏接近我。

感谢, Liron

+0

尝试包括。 strstream可能会被编译器弃用 – Arunmu

+0

当你说'实现新的'时,你究竟是什么意思? 如果你需要它,你不能把用于单独的编译单元吗? – Pete

+0

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/66b85455-d667-44dc-adcb-1e1d2aa6f50b 我遇到了这个问题,但“新”的实现是在我们正在尝试为应用创建一个插件,所以我无法删除它。 – Liron

回答

0

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

+0

我喜欢和使用Boost自己,但它的序列化库只是一场灾难。 – 2011-09-22 12:09:22

+0

不幸的是,boost并不是我们的选择,因为我们使用的SDK已经包含一个旧版本的boost,它不包含序列化。 – Liron

+0

@LKIM:您可以在一个项目中始终使用两个Boost库,只需使用静态链接即可。 – 2011-09-22 15:02:21

0

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

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; 
} 
+0

因此,foreach将迭代我想要序列化的任何随机类的所有字节? – Liron

+0

@LIMIM没有foreach遍历一个容器,这只是一个例子。你必须做的是给定的对象,获取每个属性的所有字节并装入一个字节数组。对于原始类型,您对属性的n = 0,8,16 ... sizeof进行n次移位。对作为对象的分支重复该过程而不是基元类型。请注意,这是一个漫长的过程,最好的方法是使用strstream或其他序列化库。 –