2011-02-01 116 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()); 
相關問題