2011-02-01 152 views
11

我有一个std::vector<int>并且我想序列化它。为了这个目的,我想,当我的矢量这个副本将其复制到字符串流的字符使用std::stringstream如何将二进制数据复制到字符串流

vector<int> v; 
v.resize(10); 
for (int i=0;i<10;i++) 
v[i]=i; 


stringstream ss (stringstream::in | stringstream::out |stringstream::binary); 

然而

ostream_iterator<int> it(ss); 
copy(v.begin(),v.end(),it); 

是插入缓冲(_Strbuf)的值“123456789 “

我sucssesed写一个变通方法解决方案

for (int i=1;i<10;i++) 
    ss.write((char*)&p[i],sizeof(int)); 

我想通过使用STD函数像副本做类似第一种方式

感谢赫茨尔

回答

10

实际上,这是你的解决方法,但它可能与std :: copy()算法一起使用。

template<class T> 
    struct serialize 
    { 
     serialize(const T & i_value) : value(i_value) {} 
     T value; 
    }; 

    template<class T> 
    ostream& operator <<(ostream &os, const serialize<T> & obj) 
    { 
     os.write((char*)&obj.value,sizeof(T)); 
     return os; 
    } 

使用

ostream_iterator<serialize<int> > it(ss); 
copy(v.begin(),v.end(),it); 
+0

我一般喜欢这种方法,但它往往是一个错误,盲目输出内存 喜欢这个。你仍然需要写一些能正确序列化每种类型的东西。 – 2011-02-01 15:14:55

+0

完全同意。我绝不会在生产中使用这样的代码。我宁愿上面提到的“for”循环:-) – Stas 2011-02-01 15:16:28

2

我知道这是不是一个回答你的问题,但如果你不局限于STL,你可以尝试( boost serialization)或google protocol buffers

升压甚至有积聚在除冰剂/串行化STL容器支撑体(http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html#stl )

+0

感谢奥马尔但 我需要连接到一个硬件 ,当我看到增加一些控制数据添加到数据(分类的类型) – 2011-02-01 14:52:11

1

要使用std :: copy与ostream :: write,你需要编写你自己的输出迭代器,它知道如何纠正tly序列化类型。这就是说,我不知道你期望从这种方法获得什么,但在here's a first pass对于一个例子:

struct ostream_write_int 
    : std::iterator<std::output_iterator_tag, int, void, void, void> 
{ 
    std::ostream *s; 
    ostream_write_int(std::ostream &s) : s (&s) {} 

    ostream_write_int& operator++() { return *this; } 
    ostream_write_int& operator++(int) { return *this; } 
    ostream_write_int& operator*() { return *this; } 

    void operator=(int x) { 
    s->write(reinterpret_cast<char*>(&x), sizeof(x)); 
    } 
}; 

如果你推迟序列化逻辑的一些其他功能这可能是唯一的模板(如格式化的流迭代器对运营商< <)。

1

像弗雷德,我没有看到这一点,你正在有效地试图做的是:

ss.rdbuf()->sputn(reinterpret_cast<char*>(&v[0]), sizeof(int) * v.size()); 
相关问题